¿Hay alguna forma de mostrar los árboles de dependencia para los paquetes pip?

90

Tengo un proyecto con múltiples dependencias de paquetes, los principales requisitos se enumeran en requirements.txt. Cuando lo llamo pip freezeimprime los paquetes instalados actualmente como una lista simple. Preferiría también obtener sus relaciones de dependencia, algo como esto:

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

El objetivo es detectar las dependencias de cada paquete específico:

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

E inserte estos en mi corriente requirements.txt. Por ejemplo, para esta entrada:

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

Me gustaría conseguir:

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

¿Hay alguna forma de mostrar las dependencias de los paquetes pip instalados?

tbicr
fuente
Sé que hizo esta pregunta hace cuatro años y marcó diligentemente la respuesta que obtuvo rápidamente como la mejor respuesta. Gracias por hacer eso. Sin embargo, echaría un vistazo a la respuesta que recibió de Anthon un año después. pipdeptree es IMPRESIONANTE !!! Aparentemente, @naiquevin no ha estado en SO desde abril de 2015, pero creó una herramienta realmente agradable aquí.
Rob Fagen

Respuestas:

136

Deberías echarle un vistazo a 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

No genera un requirements.txtarchivo como indicaste directamente. Sin embargo, la fuente (255 líneas de código Python) debería ser relativamente fácil de modificar según sus necesidades, o alternativamente puede (como indicó @MERose en el README de pipdeptree 0.3) usar:

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

La versión 0.5 pipdeptreetambién permite la salida JSON con la --jsonopción, que es más fácilmente analizable por máquina, a expensas de ser menos legible.

Anthon
fuente
De acuerdo con pypi.python.org/pypi/pipdeptree/0.3 , pipdeptree | grep -P '^\w+'imprime un requirements.txt.
MERose
@MERose Gracias por señalar eso. Debo haber estado usando la versión 0.2 cuando escribí esto.
Anthon
No funciona para bokeh:( Este paquete tiene una organización específica de requisitos, por lo que pip no los muestra, pero conda sí.
Sklavit
12

Advertencia: solo py2 / abandonware

yolk puede mostrar las dependencias de los paquetes, siempre que

  • fueron instalados a través de setuptools
  • vino con metadatos que incluyen información de dependencia

    $ yolk -d Theano
    Theano 0.6.0rc3
      scipy>=0.7.2
      numpy>=1.5.0
    
ali_m
fuente
Gracias. Esta no es una solución completa, pero sí de utilidad.
tbicr
No estoy seguro de si puede haber una solución completa; el problema es que la información de dependencia no siempre existe (por ejemplo, para los paquetes instalados a través de distutils, que no admite metadatos de paquetes)
ali_m
5
yolk no tiene soporte para py3k en el momento de escribir este artículo.
Yegle