Czy istnieje sposób, aby pokazać drzewa zależności dla pakietów pip?

90

Mam projekt z wieloma zależnościami od pakietów, a główne wymagania są wymienione w requirements.txt. Kiedy dzwonię pip freeze, wyświetla aktualnie zainstalowane pakiety jako zwykłą listę. Wolałbym również uzyskać ich relacje zależności, coś takiego:

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

Celem jest wykrycie zależności poszczególnych pakietów:

Werkzeug==0.8.3
    Flask==0.9
    Flask-Admin==1.0.6

I włóż to do mojego prądu requirements.txt. Na przykład dla tego wejścia:

Flask==0.9
Flask-Admin==1.0.6
Werkzeug==0.8.3

Chciałbym dostać:

Flask==0.9
    Jinja2==2.7
Flask-Admin==1.0.6
Werkzeug==0.8.3

Czy jest jakiś sposób pokazania zależności zainstalowanych pakietów pip?

tbicr
źródło
Wiem, że zadałeś to pytanie cztery lata temu i skrupulatnie oznaczyłeś odpowiedź, którą szybko otrzymałeś, jako najlepszą. Dzięki za zrobienie tego. Chciałbym jednak spojrzeć na odpowiedź, którą dostałeś od Anthona rok później. pipdeptree jest NIESAMOWITY !!! Najwyraźniej @naiquevin nie był na SO od kwietnia 2015, ale stworzył tutaj naprawdę fajne narzędzie.
Rob Fagen

Odpowiedzi:

136

Powinieneś spojrzeć na 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

Nie generuje requirements.txtpliku, jak wskazałeś bezpośrednio. Jednak źródło (255 linii kodu Pythona) powinno być stosunkowo łatwe do zmodyfikowania do twoich potrzeb, lub alternatywnie możesz (jak wskazano @MERose w pliku README pipdeptree 0.3) z użycia:

pipdeptree --freeze  --warn silence | grep -P '^[\w0-9\-=.]+' > requirements.txt

Wersja 0.5 pipdeptreeumożliwia również wyjście JSON z --jsonopcją, która jest łatwiejsza do przeanalizowania przez komputer, kosztem mniejszej czytelności.

Anthon
źródło
Zgodnie z pypi.python.org/pypi/pipdeptree/0.3 , pipdeptree | grep -P '^\w+'wyświetla wymagania.txt.
MERose,
@MERose Dzięki za wskazanie tego. Musiałem nadal używać wersji 0.2, kiedy to pisałem.
Anthon
To nie działa dla bokeh:( Ten pakiet ma określoną organizację wymagań, więc pip ich nie pokazuje, ale conda tak.
Sklavit
12

Ostrzeżenie: tylko py2 / throwonware

yolk mogą wyświetlać zależności dla pakietów, pod warunkiem, że one

  • zostały zainstalowane przez setuptools
  • przyszedł z metadanymi, które zawierają informacje o zależnościach

    $ yolk -d Theano
    Theano 0.6.0rc3
      scipy>=0.7.2
      numpy>=1.5.0
    
ali_m
źródło
Dzięki. To nie jest pełne rozwiązanie, ale przydatne narzędzie.
tbicr
Nie jestem pewien, czy możliwe jest pełne rozwiązanie - problem polega na tym, że informacje o zależnościach nie zawsze istnieją (na przykład dla pakietów zainstalowanych przez distutils, które nie obsługują metadanych pakietów)
ali_m
5
yolk nie obsługuje py3k w chwili pisania tego tekstu.
yegle