轮子取决于构建时numpy版本

时间:2018-01-09 10:50:21

标签: numpy pip python-wheel python-manylinux

我正在尝试构建一个python扩展,它使用numpy C-API来操作numpy数组。在设置部署链时,我遇到了一个问题。

在我的requirements.txtsetup.py中,我添加了依赖项numpy>=1.7,因为我使用的是该版本中引入的API功能。我在quay.io/pypa/manylinux1_x86_64泊坞窗图片中构建轮子。在图片中,我使用pip安装我的要求。这将安装numpy==1.14,因为这是当前版本,它与我的依赖项匹配。

但是,当我在我的ubuntu机器上安装mypackage-xxx-manylinux_x84_64.whl时(我有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(即使它符合我的依赖性要求),我也不想告诉我的包的每个用户手动运行此命令。关于这一点,有几个问题正是这个建议(例如12)。我是从包开发人员的角度问这里的。我该怎么做才能防止这种情况发生?

这里的最佳做法是什么?我应该专门为numpy >= 1.14添加依赖项,以便自动安装此版本吗?但是,当numpy发布新版本时,我的包会自动构建在docker镜像中的新版本,这会导致同样的问题。或者我应该在docker镜像中明确安装numpy==1.14,以获得固定版本并将其添加为依赖项?

或者有没有办法注释轮子,它们已经构建了python包?

P.S。当然,源安装没有问题,因为这个包是针对安装在用户系统上的numpy版本构建的。

1 个答案:

答案 0 :(得分:0)

我已经通过添加最小的带有精确固定的numpy版本的“ pyproject.toml”解决了我的问题。这使得pip可以在符合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已经安装。