Existe alguma maneira de mostrar as árvores de dependências para pacotes pip?

96

Tenho um projeto com várias dependências de pacote, os principais requisitos listados em requirements.txt. Quando eu ligo, pip freezeele imprime os pacotes atualmente instalados como uma lista simples. Eu preferiria também obter seus relacionamentos de dependência, mais ou menos assim:

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

O objetivo é detectar as dependências de cada pacote específico:

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

E insira isso na minha corrente requirements.txt. Por exemplo, para esta entrada:

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

Eu gostaria de obter:

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

Existe alguma maneira de mostrar as dependências dos pacotes pip instalados?

tbicr
fonte
Eu sei que você fez essa pergunta há quatro anos e diligentemente marcou a resposta que obteve rapidamente como a melhor resposta. Obrigado por fazer isso. No entanto, eu daria uma olhada na resposta que você recebeu de Anthon um ano depois. pipdeptree é INCRÍVEL !!! Aparentemente, @naiquevin não está no SO desde abril de 2015, mas ele criou uma ferramenta muito boa aqui.
Rob Fagen

Respostas:

142

Você deve dar uma olhada em 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

Não gera um requirements.txtarquivo como você indicou diretamente. No entanto, o código-fonte (255 linhas de código python) deve ser relativamente fácil de modificar de acordo com suas necessidades ou, alternativamente, você pode (como @MERose indicado no README do pipdeptree 0.3) usar:

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

A versão 0.5 do pipdeptreetambém permite a saída JSON com a --jsonopção, que é mais facilmente analisável por máquina, ao custo de ser menos legível.

Anthon
fonte
De acordo com pypi.python.org/pypi/pipdeptree/0.3 , pipdeptree | grep -P '^\w+'imprime um requirements.txt.
MERose,
@MERose Obrigado por apontar isso. Devo ainda estar usando a versão 0.2 quando escrevi isso.
Anthon,
Não está funcionando para bokeh:( Este pacote tem uma organização específica de requisitos, então pip não os mostra, mas conda sim.
Sklavit
12

Aviso: somente py2 / abandonware

yolk pode exibir dependências para pacotes, desde que eles

  • foram instalados via setuptools
  • veio com metadados que incluem informações de dependência

    $ yolk -d Theano
    Theano 0.6.0rc3
      scipy>=0.7.2
      numpy>=1.5.0
    
ali_m
fonte
Obrigado. Esta não é uma solução completa, mas é um utilitário útil
tbicr de
Não tenho certeza se pode haver uma solução completa - o problema é que as informações de dependência nem sempre existem (por exemplo, para pacotes instalados via distutils, que não suporta metadados de pacote)
ali_m
5
yolk não tinha suporte a py3k no momento em que este artigo foi escrito.
yegle