我有一个在 Linux 上使用 C 扩展编译的项目,但在 Windows 上没有它们。当我第一次在 Windows 上使用 生成轮子文件时python setup.py bdist_wheel
,它们变得通用,我无法将它们上传到 PyPI,因为这些通用轮子更适合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
并使用额外的关键字参数调用setup()
setup.py distclass=BinaryDistribution,
。
这一切在我运行 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
pip
当你pip
在 Windows 上运行和pip
在 Linux 上运行时,你会下载并安装相应的包
pkg-1.0.tar.gz
其中包括在安装期间编译的 C 源代码。
问题开始于我没有可以安装 Python 3.5 的备用 Windows 7 许可机器(它不安装在 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 的文件?