sau*_*ger 5 numpy pip python-wheel python-manylinux
我正在尝试构建一个 python 扩展,它使用 numpy C-API 来操作 numpy 数组。在设置部署链时,我遇到了一个问题。
在我requirements.txt和setup.py我中添加了依赖项numpy>=1.7,因为我正在使用该版本中引入的 API 功能。我正在quay.io/pypa/manylinux1_x86_64docker 镜像中造轮子。在图像内,我正在使用安装我的要求pip。这将安装numpy==1.14,因为这是当前版本,与我的依赖项匹配。
mypackage-xxx-manylinux_x84_64.whl但是,当我在 ubuntu 机器(有 numpy )上安装时1.8,在导入包时收到以下错误
---------------------------------------------------------------------------
RuntimeError Traceback (most recent call last)
RuntimeError: module compiled against API version 0xc but this version of numpy is 0x9
---------------------------------------------------------------------------
ImportError
[...]
ImportError: numpy.core.multiarray failed to import
Run Code Online (Sandbox Code Playgroud)
明显的解决方法是我运行pip install -U numpy. 但是,我不想告诉我的包的每个用户如果他们的 numpy 库是<1.14(即使它符合我的依赖项要求),则手动运行此命令。与此建议相关的几个问题(例如1、 2)。我是从软件包开发人员的角度在这里问的。首先我可以做什么来防止这种情况发生?
这里的最佳实践是什么?我是否应该专门添加 的依赖项numpy >= 1.14,以便自动安装该版本?然而,当 numpy 发布新版本时,我的包会自动针对 docker 镜像中的新版本构建,这会导致同样的问题。或者我应该明确安装numpy==1.14在 docker 映像中,以获得固定版本并将其添加为依赖项?
或者有没有一种方法可以注释轮子,它们是针对哪些 python 包构建的?
PS 当然,源安装没有问题,因为软件包是针对用户系统上安装的 numpy 版本构建的。
我通过添加一个带有精确固定 numpy 版本的最小“pyproject.toml”,满意地解决了这个问题。这使得 pip install 处于符合 PEP 517 的构建隔离模式,其中仅安装此文件中列出的依赖项。
[build-system]
requires = ['numpy==1.12.2', 'setuptools>=40.8.0', 'wheel', 'packaging']
build-backend = "setuptools.build_meta"
Run Code Online (Sandbox Code Playgroud)
不过,我的仍然列表install_requires中,所以当安装生成的轮子时,pip 不会(尝试)强制将 numpy 降级为例如已经安装的版本。setup.pynumpy>=1.12.21.12.21.16.2
| 归档时间: |
|
| 查看次数: |
1023 次 |
| 最近记录: |