numpy - Wheel 取决于构建时的 numpy 版本

标签 numpy pip python-wheel python-manylinux

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

在我的 requirements.txtsetup.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,我不想告诉我的包的每个用户手动运行此命令。 (即使它符合我的依赖性要求)。这个建议有几个问题(例如 12 )。我是从软件包开发人员的角度在这里提问的。首先我能做些什么来防止这种情况发生?

这里的最佳做法是什么?我应该专门为 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/

相关文章:

Python安装OPCUA包

dependencies - 如何编写一个 pip 要求文件,使其不安装测试版?

Python 3.5 - 如何在 Windows 7 64 位中安装 lxml

python - 保存 32 位浮点 TIFF 图像

python - 有没有更快的方法在 numpy 中进行这种索引?

python - 如何根据条件交换两行中选定的数据

python - python 写入二进制文件

python - 使用 pip 在 Windows 中安装 Airflow 时出错

python - 如何使用已编译的 Fortran 扩展模块构建 Python 轮而不需要用户系统上的特定 MinGW 版本?

python - 存储的轮子 .whl 缓存文件在哪里?