我正在尝试构建一个使用numpy C-API来操作numpy数组的python扩展。在设置部署链时,我遇到了一个问题。
在我的requirements.txt
和setup.py
中添加了依赖项numpy>=1.7
,因为我正在使用该版本中引入的 API 功能。我正在quay.io/pypa/manylinux1_x86_64
docker 映像中构建轮子。在映像中,我正在使用pip
安装我的需求。这将安装numpy==1.14
,因为这是当前版本,与我的依赖项匹配。
但是,当我在我的 ubuntu 机器(具有 numpy1.8
)上安装mypackage-xxx-manylinux_x84_64.whl
时,我在导入软件包时收到以下错误
---------------------------------------------------------------------------
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 映像中的新版本构建,这会导致同样的问题。还是我应该在 docker 映像中显式安装numpy==1.14
,以获得固定版本并将其添加为依赖项?
或者有没有办法注释轮子,它们是针对哪些 python 包构建的?
附言当然,源安装没有问题,因为这样软件包就是针对安装在用户系统上的numpy版本构建的。
我已经通过添加带有精确固定 numpy 版本的最小"pyproject.toml"来解决这个问题,令我满意。这使得 pip 安装在符合 PEP 517 的构建隔离模式下,在该模式下,仅安装此文件中列出的依赖项。
[build-system]
requires = ['numpy==1.12.2', 'setuptools>=40.8.0', 'wheel', 'packaging']
build-backend = "setuptools.build_meta"
不过,我在setup.py
中的install_requires
仍然列出了numpy>=1.12.2
,因此当安装生产的轮子时,pip 不会(尝试)强制将 numpy 降级到1.12.2
例如已安装1.16.2
。
(可能已经过时了,但是:)
你可以试试
pip install --no-build-isolation
在生成和运行时之间保持一致的版本。可能的警告是,您需要单独安装构建要求。