Есть ли способ показать деревья зависимостей для пакетов pip?
У меня есть проект с несколькими зависимостями пакетов, основные требования перечислены в requirements.txt
, Когда я звоню pip freeze
он печатает установленные в данный момент пакеты в виде простого списка. Я бы предпочел также получить их отношения зависимости, что-то вроде этого:
Flask==0.9
Jinja2==2.7
Werkzeug==0.8.3
Jinja2==2.7
Werkzeug==0.8.3
Flask-Admin==1.0.6
Flask==0.9
Jinja2==2.7
Werkzeug==0.8.3
Цель состоит в том, чтобы обнаружить зависимости каждого конкретного пакета:
Werkzeug==0.8.3
Flask==0.9
Flask-Admin==1.0.6
И вставить это в мой текущий requirements.txt
, Например, для этого ввода:
Flask==0.9
Flask-Admin==1.0.6
Werkzeug==0.8.3
Я хотел бы получить:
Flask==0.9
Jinja2==2.7
Flask-Admin==1.0.6
Werkzeug==0.8.3
Есть ли способ показать зависимости установленных пакетов pip?
5 ответов
Вы должны взглянуть на pipdeptree
:
$ pip install pipdeptree
$ pipdeptree -fl
Warning!!! Cyclic dependencies found:
------------------------------------------------------------------------
xlwt==0.7.5
ruamel.ext.rtf==0.1.1
xlrd==0.9.3
openpyxl==2.0.4
- jdcal==1.0
pymongo==2.7.1
reportlab==3.1.8
- Pillow==2.5.1
- pip
- setuptools
Это не генерирует requirements.txt
файл, как вы указали напрямую. Однако исходный код (255 строк кода Python) должно быть относительно легко изменить в соответствии с вашими потребностями, или, в качестве альтернативы, вы можете (как указано @MERose в pipdeptree 0.3 README) использовать:
pipdeptree --freeze --nowarn | grep -P '^[\w0-9\-=.]+' > requirements.txt
Версия 0.5 pipdeptree
также позволяет вывод JSON с --json
вариант, который легче разобрать на машине, за счет того, что он менее читабелен.
yolk
может отображать зависимости для пакетов при условии, что они
- были установлены через
setuptools
пришли с метаданными, которые включают информацию о зависимостях
$ yolk -d Theano Theano 0.6.0rc3 scipy>=0.7.2 numpy>=1.5.0
Вы можете сделать это, установив package.
Откройте командную строку в папке вашего проекта. Если вы используете какую-либо виртуальную среду, переключитесь на эту виртуальную среду.
Установить
pipdeptree
пакет с использованием pip
pip install pipdeptree
pipdeptree -fl
В этом пакете будут перечислены все зависимости вашего проекта.
Для получения дополнительной информации о pipdeptree
Я понимаю, что прошло много лет с тех пор, как был задан этот вопрос, но он обнаружился в моих поисках, поэтому я решил поделиться некоторыми знаниями.
The pip-tools
package содержит инструмент под названием, который, по-видимому, также решает проблему исходного постера.
принимает входной файл, который может быть setup.py, setup.cfg, pyproject.toml или requirements.in. Входной файл — это то, что вы пишете вручную, и он содержит «прямые» зависимости. Он может не указывать точные версии зависимостей, но может использовать диапазоны версий (и вообще никаких ограничений). Инструмент выводит новый файл rquirements.txt со всеми добавленными косвенными зависимостями, а также связывает зависимости с точными версиями.
Если вы снова запустите инструмент после обновления исходного файла, он добавит или удалит зависимости из выходного файла, если это необходимо. Вы также можете обновить конкретную зависимость, добавив флаг.
Так что покаpip-compile
не показывает вам само дерево зависимостей, оно помогает вам собрать все листья дерева зависимостей (что, я полагаю, было тем, что в конце концов хотел сделать первоначальный постер).
Подробнее читайте здесь: https://github.com/jazzband/pip-tools/
Используйте команду pip-compile, чтобы заморозить файл require.in.
Pip-tools v6.14.0, похоже, имеет команду pip-compile для генерацииrequirements.txt
файл с аннотацией по умолчанию. Я вижу, что вы просто намерены заморозить установленный пакет из virtualenv, но лучший способ — иметьsetup.py
илиrequirements.in
файл, в который вы записываете установленные пакеты с указанием версии.
Вывод будет аналогичен приведенному ниже:
# requirements.txt
# This file is autogenerated by pip-compile with Python 3.7
# by the following command:
#
# pip-compile --no-emit-index-url --output-file requirements.txt setup.py
#
my-private-package==2.3.0
# via my-repo (setup.py)
alembic==1.7.4
# via my-private-package-dep
amqp==2.6.1
# via kombu
Вы также можете использовать--no-annotate
arg, чтобы отключить аннотацию зависимостей.