【发布时间】:2016-05-08 20:10:14
【问题描述】:
我有一个在 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.py 中使用额外的关键字参数 distclass=BinaryDistribution, 调用 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 源代码。
问题始于我没有可以安装 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 的文件?
【问题讨论】:
-
我刚刚遇到了完全相同的问题,使用 Windows 7 和 python 3.5。恢复到车轮 0.24.0 确实解决了这个问题。我尝试查找 Wheel 0.25+ 何时发布,但在 bitbucket repo 上找不到标签。有什么想法吗?
-
@Overdrivr 那是 2015 年 9 月 17 日。通过在pypi 上查找轮子可以轻松找到此类信息(搜索 pypi 本身会显示一些旧版本,或者您自己将 URL 的末尾从 0.26.0 更改)
-
标签: python windows pypi python-wheel appveyor