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
)
Ответы
Ответ 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-сервер, но немного упущенный.