Wheel 取决于构建时的 numpy 版本
Wheel depends on build-time numpy version
我正在尝试构建一个 python 扩展,它使用 numpy C-API 来操作 numpy 数组。设置部署链时遇到问题。
在我的 requirements.txt
和 setup.py
中,我添加了依赖项 numpy>=1.7
,因为我正在使用该版本中引入的 API 功能。我正在 quay.io/pypa/manylinux1_x86_64
docker 图像中构建轮子。在图像中,我正在使用 pip
安装我的要求。这将安装 numpy==1.14
,因为这是当前版本,与我的依赖项匹配。
但是,当我在我的 ubuntu 机器(有 numpy 1.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 软件包是根据这些车轮构建的?
P.S。当然,源码安装是没有问题的,因为这个包是针对安装在用户系统上的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"
我的 install_requires
在我的 setup.py
中仍然列出 numpy>=1.12.2
,所以当安装生产的轮子时,pip 不会(尝试)强行将 numpy 降级到 1.12.2
如果例如 1.16.2
已经安装。
我正在尝试构建一个 python 扩展,它使用 numpy C-API 来操作 numpy 数组。设置部署链时遇到问题。
在我的 requirements.txt
和 setup.py
中,我添加了依赖项 numpy>=1.7
,因为我正在使用该版本中引入的 API 功能。我正在 quay.io/pypa/manylinux1_x86_64
docker 图像中构建轮子。在图像中,我正在使用 pip
安装我的要求。这将安装 numpy==1.14
,因为这是当前版本,与我的依赖项匹配。
但是,当我在我的 ubuntu 机器(有 numpy 1.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 软件包是根据这些车轮构建的?
P.S。当然,源码安装是没有问题的,因为这个包是针对安装在用户系统上的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"
我的 install_requires
在我的 setup.py
中仍然列出 numpy>=1.12.2
,所以当安装生产的轮子时,pip 不会(尝试)强行将 numpy 降级到 1.12.2
如果例如 1.16.2
已经安装。