Есть ли способ показать деревья зависимостей для пакетов 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-toolspackage содержит инструмент под названием, который, по-видимому, также решает проблему исходного постера.

принимает входной файл, который может быть 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-annotatearg, чтобы отключить аннотацию зависимостей.

Другие вопросы по тегам