- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个在 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/
在 RHEL 计算机上 我有一些旧的 Django 项目正在迁移到新服务器,这些项目是为 Python2.6、Django1.4.3 编写的 我已经安装了 python2.7,在我的主目录中创建了 v
我有以下项目结构: . ├── docs ├── examples ├── MANIFEST.in ├── README.rst ├── setup.cfg ├── setup.py └── mypr
我们想从我们创建的包中排除 Python 源代码。但是在配置setup.py之后,我排除py文件失败了。我一直在使用 python setup.py bdist_wheel 作为命令。有没有办法从 P
我有一个在 Linux 上使用 C 扩展编译的项目,但没有他们在 Windows 上。当我第一次在 Windows 上使用 python setup.py bdist_wheel 生成 wheel 文
我已经尝试了这个非常相关的问题中的所有方法: Why can I not create a wheel in python? 但我仍然得到: usage: setup.py [global_opts]
我刚学会上传my own python packages to PyPI感谢这个惊人的tutorial.我现在试图更好地理解 wheels 的工作原理,我发现 this article有帮助。 但是,
背景:我有一个负责安全的源文件。里面有魔术键和特定的算法。 是否可以从 python egg 或 wheel 包中删除这个单一的源文件? 我已经完成了使用 egg 命令只发送二进制文件。 python
做的时候 python setup.py sdist bdist_wheel 它创建 build , dist , packagename.egg-info目录。我想将它们从当前文件夹中删除。 我试过
我尝试在 Ubuntu 20.04.01 上安装 watchman: guettli@yoga15:~/tmp$ python3 -m venv pywatchman-test guettli@yog
我创建了一个用于教育目的的 pypi 包,我想进行升级。我完成了通常的步骤(进行更改、运行 setup.py 等) 但是当我这样做的时候: python3 setup.py bdist_wheel 我
长话短说 我正在尝试为使用 setuptools-scm 的项目创建内置分发包。我生成了运行 python setup.py sdist bdist_wheel 的 wheel 包。我可以使用 pip
假设我有一个简单的库,它使用 setuptools用于包装和分发。在这种情况下,库还需要最低版本的 Python 3.6,这意味着我的 setup.py 将如下所示: from setuptools
我有一个 Python 包,其中包括 bin_win32、bin_win64、bin_osx、bin_lnx32 和 bin_lnx64 子目录,其中包含适合平台的二进制文件,我通过 Python 文
我正在尝试创建一个 Python 发行版,我必须在其中包含源代码和编译后的二进制文件。 (是的,我阅读了反对/支持添加 .pyc 的论据,但我的用例需要添加 .pyc)。在 Windows 中运行我的
我的 Python 包有一个 setup.py,当我像这样配置它时,它可以在 Ubuntu Trusty 和新的 Vagrant Ubuntu Trusty VM 上本地构建: sudo apt-ge
在执行python setup.py bdist_wheel时出现错误: 错误:setup.cfg 中出现错误:命令“bdist_wheel”没有此类选项“universal” 如何解决这个问题? 最
我正在尝试创建一个可用作终端命令的 Python 包。我的 setup.py 文件看起来像 import setuptools # If the package is being updated (a
我正在尝试在我新格式化的 Mac OS High Sierra 10.13.4 上运行我的 Python 3 项目,首先运行 pipenv install 以获取依赖项,但失败了。 具体来说,安装依赖
这个问题在这里已经有了答案: pygame installation issue in mac os (5 个答案) 关闭 2 年前。 我正在尝试在 anaconda 安装上为 Python 3 安
对于使用 otree ( http://otree.readthedocs.io/ ) 的项目,我在尝试安装 Channels 以使用实时功能时遇到了一些问题。 由于输出很长,我试图找出最重要的部分:
我是一名优秀的程序员,十分优秀!