gpt4 book ai didi

python - 'pip setup.py bdist_wheel' 不再构建强制非纯轮子

转载 作者:太空狗 更新时间:2023-10-29 21:20:46 24 4
gpt4 key购买 nike

我有一个在 Linux 上使用 C 扩展编译的项目,但没有他们在 Windows 上。当我第一次在 Windows 上使用 python setup.py bdist_wheel 生成 wheel 文件时,它们变得通用,我无法将它们上传到 PyPI,因为这些通用 wheel 是 pip 的首选安装用通过 .tar.gz 上传(来自 python setup.py sdist 的结果)。

解决这个问题的技巧是在 setup.py 中指定:

Distribution.is_pure = lambda *args: False

或通过继承 Distribution:

class BinaryDistribution(Distribution):
def is_pure(self):
return False

并使用额外的关键字参数 distclass=BinaryDistribution, 在 setup.py 中调用 setup()

这一切在我运行 Windows XP 64 的 VM 上运行良好,该 VM 具有 32 位和 64 位版本的 Python 2.6/2.7/3.3/3.4 和 pypy 专门为此目的安装。一个简单的批处理文件给我:

dist/pkg-1.0-cp26-none-win32.whl
dist/pkg-1.0-cp26-none-win_amd64.whl
dist/pkg-1.0-cp27-none-win32.whl
dist/pkg-1.0-cp27-none-win_amd64.whl
dist/pkg-1.0-cp33-none-win32.whl
dist/pkg-1.0-cp33-none-win_amd64.whl
dist/pkg-1.0-cp34-none-win32.whl
dist/pkg-1.0-cp34-none-win_amd64.whl

当您在 Windows 上运行 pip 以及在 Linux 上运行 pip 时,pip 会下载并安装相应的包

pkg-1.0.tar.gz

其中包括在安装过程中编译的 C 源代码。

问题始于我没有备用的 Windows 7 许可机器,我可以在其中安装 Python 3.5(它不会安装在 EOL XP 上)。所以我调查了Appveyor并创建了 appveyor.yml:

environment:
matrix:
- PYTHON: C:\Python27
- PYTHON: C:\Python33
- PYTHON: C:\Python34
- PYTHON: C:\Python35
- PYTHON: C:\Python27-x64
- PYTHON: C:\Python33-x64
DISTUTILS_USE_SDK: '1'
- PYTHON: 'C:\Python34-x64'
DISTUTILS_USE_SDK: '1'
- PYTHON: 'C:\Python35-x64'

install:
- |
%PYTHON%\python.exe -m pip install --upgrade pip
%PYTHON%\python.exe -m pip install wheel

build: off

test_script:
- echo Skipped for now

after_test:
- |
%PYTHON%\python.exe setup.py bdist_wheel

artifacts:
- path: dist\*

使用完全相同的来源,以上八次调用 python setup.py bdist_wheel 的结果是:

pkg-1.0-py2-none-any.whl
pkg-1.0-py3-none-any.whl

如果您将这些上传到 PyPI,Linux 更喜欢它们而不是 .tar.gz,从而导致不包含 C 扩展代码。

是什么原因造成的,我如何使用 Appveyor 构建我的 .whl 文件(或者至少是 Python 3.5 的文件?

最佳答案

我自己刚刚在 Windows 7 x64 上使用 Python v2.7 和 wheel v0.29.0 遇到了这个问题,我在其中构建了一个带有一些预编译扩展的 Python 包(复杂的 VisualStudio 设置与 SWIG 和外部 DLL)。

检查源代码后,我发现重写 Distribution.has_ext_modules 有效(自动包含平台名称和 ABI 标签):

from setuptools import setup
from setuptools.dist import Distribution

DISTNAME = "packagename"
DESCRIPTION = ""
MAINTAINER = ""
MAINTAINER_EMAIL = ""
URL = ""
LICENSE = ""
DOWNLOAD_URL = ""
VERSION = '1.2'
PYTHON_VERSION = (2, 7)


# Tested with wheel v0.29.0
class BinaryDistribution(Distribution):
"""Distribution which always forces a binary package with platform name"""
def has_ext_modules(foo):
return True


setup(name=DISTNAME,
description=DESCRIPTION,
maintainer=MAINTAINER,
maintainer_email=MAINTAINER_EMAIL,
url=URL,
license=LICENSE,
download_url=DOWNLOAD_URL,
version=VERSION,
packages=["packagename"],

# Include pre-compiled extension
package_data={"packagename": ["_precompiled_extension.pyd"]},
distclass=BinaryDistribution)

关于python - 'pip setup.py bdist_wheel' 不再构建强制非纯轮子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35112511/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com