是否有可能让设置工具extras_require覆盖install_requires的要求?



是否可以让setuptools的extras_require覆盖install_requires中设置的要求?我的猜测是否定的,因为extras_require是一个

。字典映射"额外"的名称(项目的可选功能(...

因此,由于它是"可选的",因此install_requires将始终优先。我想我会问以防万一。

提出这个问题的原因是以下用例,以下示例setup.py

from setuptools import setup, find_packages
setup(
...
install_requires = [
'numpy<=1.14.5,>=1.14.0',
...
],
extras_require = {
...
'tensorflow':[
'tensorflow>=1.10.0',
'numpy<=1.14.5,>=1.13.3',
'setuptools<=39.1.0',
]
},
...
)

你有一个支持多个计算后端的库(例如,NumPy,TensorFlow,PyTorch(,但安装的默认后端只是NumPy,然后可以通过不同的选项安装不同的后端。TensorFlow要求

tensorflow 1.10.1 has requirement numpy<=1.14.5,>=1.13.3

但是,如果用户只想要 NumPy 后端,您不想强制限制 NumPy。因此,理想情况下,人们install_requires只是numpy>=1.14.0用户这样做

pip install .

然后对于想要TensorFlow的用户,他们只会使用

pip install -e .[tensorflow]

但是,这当然不起作用,就好像install_requires只是numpy>=1.14.0然后安装了最新的 PyPI 版本的 NumPy(此时1.15.1(,并且在安装过程中收到警告

tensorflow 1.10.1 has requirement numpy<=1.14.5,>=1.13.3, but you'll have numpy 1.15.1 which is incompatible.

那么,无论如何,我可以在install_requires中取消限制NumPy版本,然后在需要时让setuptools检查并使用extras_require中指定的版本吗?

对于上下文:

$ python --version
Python 3.6.6
$ pip --version
pip 18.0 from /usr/local/lib/python3.6/site-packages/pip (python 3.6)
$ easy_install --version
setuptools 40.0.0 from /usr/local/lib/python3.6/site-packages (Python 3.6)

答案(经过一番思考(是期望的结果是可能的,但不是通过覆盖install_requires,而是在install_requires中有一个要求,需要所需的库(所以这是非常黑客的(。为了说明如何使用此setup.py

from setuptools import setup, find_packages
setup(
...
install_requires = [
'scipy', # scipy requires numpy, and so will get the latest release from PyPI
...
],
extras_require = {
...
'tensorflow':[
'tensorflow>=1.10.0',
'numpy<=1.14.5,>=1.13.3',
'setuptools<=39.1.0',
]
},
...
)

现在

$ pip install .
$ pip freeze | grep numpy
numpy==1.15.1
$ pip freeze | grep scipy
scipy==1.1.0

$ pip freeze | xargs pip uninstall -y
$ pip install .[tensorflow]
$ pip freeze | grep numpy
numpy==1.14.5
$ pip freeze | grep scipy
scipy==1.1.0

最新更新