可能会有setuptools extras_require覆盖install_requires的要求吗?

时间:2018-09-05 19:50:44

标签: python pip setuptools

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

  

... dictionary mapping names of “extras” (optional features of your project) ...

,因此,由于它是“可选”的,因此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一样,然后安装了NumPy的最新PyPI版本(此时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)

1 个答案:

答案 0 :(得分:1)

(稍加思考)答案是希望结果是是可能的,但不是是通过覆盖install_requires,但有一个要求在install_requires中需要所需的库(因此非常hacky)。为了说明如何使用此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
相关问题