Возможно ли установить требование переопределения extras_require в setuptools из install_requires? - PullRequest
0 голосов
/ 05 сентября 2018

Возможно ли, чтобы 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.

Так есть ли в любом случае, что я могу ограничить выпуск NumPy в install_requires, а затем заставить 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 голосов
/ 05 сентября 2018

Ответ (после чуть более обдуманного) заключается в том, что желаемый результат возможен , но не путем переопределения 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
...