Подтвердить что ты не робот

Setuptools и pip: выбор минимальной и полной установки

Мы создали библиотеку, которая зависит от других библиотек. Но необходимы (например, для пакетной обработки сервера) и необязательные зависимости (например, для клиентов с графическим интерфейсом).

Возможно ли что-то подобное:

pip install mylib.tar.gz  # automatically downloads and installs with the minimal set of dependencies

pip install mylib.tar.gz  --install-option="complete"  # automatically installs with all dependencies

Я нашел флаг extra_require, но как я могу сказать pip использовать их? setup.py выглядит следующим образом:

from setuptools import setup

# ...

# Hard library depencencies:
requires = [
    "numpy>=1.4.1",
    "scipy>=0.7.2",
    "traits>=3.4.0"
]

# Soft library dependencies:
recommended = {
    "mpl": ["matplotlib>=0.99.3"],
    "bn": ["bottleneck>=0.6"]
}

# ...

# Installer parameters:
setup(
    name = "mylib",
    #...
    install_requires = requires,
    extras_require = recommended
)
4b9b3361

Ответ 1

Вы можете установить пакеты в extras_require, добавив имя рекомендуемой зависимости в квадратных скобках (т.е. [mpl] или [bn] в вашем случае) к имени пакета в пипе.

Итак, чтобы установить "mylib" с дополнительными требованиями, вы вызываете pip следующим образом:

pip install 'mylib[mpl]'
pip install 'mylib[bn]'

Сначала загружаются и устанавливаются дополнительные зависимости, а затем mylib зависимости ядра.

Это анологично, как вы объявляете эти зависимости с помощью setuptools: http://pythonhosted.org/setuptools/setuptools.html#declaring-extras-optional-features-with-their-own-dependencies (см. значение install_requires в третьем примере)

Ответ 2

Так что пип на самом деле довольно разборчив в отношении установки библиотек с дополнительными требованиями

pip install -e ".[extra,requirements]"    # works with file paths
pip install "package[extra,requirements]" # works when downloading packages
pip install ".[extra,requirments]"        # DOES NOT WORK

Я думаю, что это не так, как работает парсер RequirementsSpec, а pip делает дополнительную магию с флагом -e. Так или иначе, после большого удара головой, здесь слегка уродливое обходное решение

pip install "file:///path/to/your/python_code#egg=SomeName[extra,requirements]"

Часть egg=SomeName в основном игнорируется, но pip правильно подбирает дополнительные требования

Предостережения

  • Протестировано с помощью протокола 1.5.6, поэтому убедитесь, что вы используете текущую версию протокола.
  • Насколько я могу судить, синтаксис file:/// недокументирован в пипе, поэтому я не уверен, изменится он в будущем. Он немного похож на синтаксис VCS Support, но я был немного удивлен, что он сработал.
  • Вы также можете обойти это, запустив свой собственный pypi-сервер, но немного упущенный.