我正在尝试构建一个 python 扩展,它使用 numpy C-API 来操作 numpy 数组。在设置部署链时,我遇到了一个问题。
在我的 requirements.txt
和 setup.py
我添加了依赖项 numpy>=1.7
,因为我正在使用该版本中引入的 API 功能。我正在 quay.io/pypa/manylinux1_x86_64
中制造轮子 docker 形象。在图像中,我正在使用 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
明显的解决方法是我运行
pip install -U numpy
.但是,如果他们的 numpy 库是 <1.14
,我不想告诉我的包的每个用户手动运行此命令。 (即使它符合我的依赖性要求)。这个建议有几个问题(例如 1 , 2 )。我是从软件包开发人员的角度在这里提问的。首先我能做些什么来防止这种情况发生?这里的最佳做法是什么?我应该专门为
numpy >= 1.14
添加一个依赖项吗? ,这样这个版本是自动安装的?但是,当 numpy 发布新版本时,我的包会自动针对 docker 镜像中的新包构建,这导致了同样的问题。或者我应该明确安装 numpy==1.14
在 docker 镜像中,有一个固定版本并将其添加为依赖项?或者有没有办法注释轮子,它们是针对哪些python包构建的?
附言当然,源代码安装没有问题,因为该包是针对用户系统上安装的 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"
我的
install_requires
在我的 setup.py
仍然列出 numpy>=1.12.2
但是,因此当安装了生产的轮子时,pip 不会(尝试)强行将 numpy 降级到 1.12.2
如果例如 1.16.2
已经安装。
关于numpy - Wheel 取决于构建时的 numpy 版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48166508/