Existe-t-il un moyen d'afficher les arborescences de dépendances pour les packages pip?

91

J'ai un projet avec plusieurs dépendances de packages, les principales exigences étant répertoriées dans requirements.txt. Quand je l'appelle, pip freezeil imprime les packages actuellement installés sous forme de liste simple. Je préférerais également obtenir leurs relations de dépendance, quelque chose comme ceci:

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

Le but est de détecter les dépendances de chaque package spécifique:

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

Et insérez-les dans mon courant requirements.txt. Par exemple, pour cette entrée:

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

Je voudrais obtenir:

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

Existe-t-il un moyen d'afficher les dépendances des packages pip installés?

tbicr
la source
Je sais que vous avez posé cette question il y a quatre ans et que vous avez marqué avec diligence la réponse que vous avez rapidement obtenue comme étant la meilleure. Merci d'avoir fait ça. Cependant, je jetterais un œil à la réponse que vous avez obtenue d'Anthon un an plus tard. pipdeptree est génial !!! Apparemment, @naiquevin n'a pas été sur SO depuis avril 2015, mais il a créé un très bel outil ici.
Rob Fagen du

Réponses:

137

Vous devriez jeter un oeil à 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

Il ne génère pas de requirements.txtfichier comme vous l'avez indiqué directement. Cependant, la source (255 lignes de code python) devrait être relativement facile à modifier selon vos besoins, ou vous pouvez également (comme @MERose indiqué est dans le pipdeptree 0.3 README) utiliser:

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

La version 0.5 de pipdeptree permet également la sortie JSON avec l' --jsonoption, qui est plus facilement analysée par la machine, au détriment d'être moins lisible.

Anthon
la source
Selon pypi.python.org/pypi/pipdeptree/0.3 , pipdeptree | grep -P '^\w+'imprime un requirements.txt.
MERose
@MERose Merci de l'avoir signalé. Je devais toujours utiliser la version 0.2 lorsque j'ai écrit ceci.
Anthon
Cela ne fonctionne pas pour bokeh:( Ce package a une organisation spécifique des exigences, donc pip ne les montre pas, mais conda le fait.
Sklavit
12

Attention: py2 uniquement / abandonware

yolk peut afficher les dépendances pour les packages, à condition qu'elles

  • ont été installés via setuptools
  • livré avec des métadonnées qui incluent des informations de dépendance

    $ yolk -d Theano
    Theano 0.6.0rc3
      scipy>=0.7.2
      numpy>=1.5.0
    
ali_m
la source
Merci. Cette solution n'est pas complète, mais utilitaire cependant utile.
tbicr
Je ne sais pas s'il peut y avoir une solution complète - le problème est que les informations de dépendance n'existent pas toujours (par exemple pour les packages installés via distutils, qui ne prennent pas en charge les métadonnées de package)
ali_m
5
yolk ne prend pas en charge py3k au moment de la rédaction.
yegle