Como listar todos os pacotes instalados e suas versões no Python?

Respostas:

196

Se você possui o pip install e deseja ver quais pacotes foram instalados com as ferramentas do instalador, basta chamar isso:

pip freeze

Também incluirá números de versão para os pacotes instalados.

Atualizar

O pip foi atualizado para também produzir a mesma saída pip freezechamando:

pip list

Nota

A saída de pip listé formatada de forma diferente; portanto, se você tiver algum script de shell que analise a saída (talvez para pegar o número da versão) freezee deseje alterar seu script para chamar list, será necessário alterar seu código de análise.

Jeff LaFay
fonte
9
IMHO eles devem fornecer pip listcomo um apelido para pip freeze. É intuitivo escrever pip freeze > requirements.txt, mas não pip freeze.
Jsalonen 17/10/12
3
WOW: Acabei de examinar a documentação da versão mais recente do pip e parece que eles adicionaram pip list: pip-installer.org/en/latest/usage.html#pip-list - então isso já é algo que já está chegando!
Jsalonen
51

help('modules') deve fazer isso por você.

no IPython:

In [1]: import                      #import press-TAB
Display all 631 possibilities? (y or n)
ANSI                   audiodev               markupbase
AptUrl                 audioop                markupsafe
ArgImagePlugin         avahi                  marshal
BaseHTTPServer         axi                    math
Bastion                base64                 md5
BdfFontFile            bdb                    mhlib
BmpImagePlugin         binascii               mimetools
BufrStubImagePlugin    binhex                 mimetypes
CDDB                   bisect                 mimify
CDROM                  bonobo                 mmap
CGIHTTPServer          brlapi                 mmkeys
Canvas                 bsddb                  modulefinder
CommandNotFound        butterfly              multifile
ConfigParser           bz2                    multiprocessing
ContainerIO            cPickle                musicbrainz2
Cookie                 cProfile               mutagen
Crypto                 cStringIO              mutex
CurImagePlugin         cairo                  mx
DLFCN                  calendar               netrc
DcxImagePlugin         cdrom                  new
Dialog                 cgi                    nis
DiscID                 cgitb                  nntplib
DistUpgrade            checkbox               ntpath
Ashwini Chaudhary
fonte
5
Isso é útil! Eu adoraria ver as versões também.
Jsalonen 17/10/12
4
Eu acho que o problema é não há nenhuma padronizados maneira de incluir a versão ... às vezes seu Package.version()ou package.__version__ou package.verou qualquer número de outras possibilidades
Joran Beasley
Eu pensei que o lema da python era "só há uma maneira de fazer isso";)?
Ed Randall
3
@ EdRandall, não - é "uma maneira óbvia de fazê-lo". Sempre há uma maneira óbvia. Além disso, o texto exato é: Deve haver uma - e preferencialmente apenas uma - maneira óbvia de fazê-lo. Embora esse caminho possa não ser óbvio a princípio, a menos que você seja holandês.
rosuav 12/09/14
30

Se você deseja obter informações sobre suas distribuições python instaladas e não deseja usar o console ou terminal do cmd para isso, mas através do código python, você pode usar o seguinte código (testado com python 3.4):

import pip #needed to use the pip functions
for i in pip.get_installed_distributions(local_only=True):
    print(i)

A pip.get_installed_distributions(local_only=True)chamada de função retorna um iterável e, devido ao loop for e à função de impressão, os elementos contidos no iterável são impressos separados por novos caracteres de linha ( \n). O resultado (dependendo das distribuições instaladas) será mais ou menos assim:

cycler 0.9.0
decorator 4.0.4
ipykernel 4.1.0
ipython 4.0.0
ipython-genutils 0.1.0
ipywidgets 4.0.3
Jinja2 2.8
jsonschema 2.5.1
jupyter 1.0.0
jupyter-client 4.1.1
#... and so on...
gelado
fonte
4
Para expandir a @ o comentário de exhuma, com pip 10 você deve usar: pkg_resources importação [de impressão (d.project_name) para d em pkg_resources.working_set]
Almenon
Qual é o estado de pkg_resources? AFAICR isso faz parte setuptools. Não pip. Podemos assumir com segurança que setuptoolssempre estará disponível, dependendo apenas pip?
Exhuma
9

Você pode tentar: Gema

Para instalar a gema, tente:

easy_install yolk

Yolk é uma ferramenta Python para obter informações sobre pacotes Python instalados e consultar pacotes disponíveis no PyPI (Índice de Pacotes Python).

Você pode ver quais pacotes estão ativos, inativos ou no modo de desenvolvimento e mostrar quais versões mais recentes estão disponíveis consultando o PyPI.

llazzaro
fonte
Normalmente, uso o pip para esta tarefa neste momento, mas tenho um projeto muito antigo no qual não estou pronto para adicionar a distribuição e lembrei-me de que havia uma ferramenta como essa por aí. Não conseguia se lembrar como era chamado ... Era isso!
meshantz
1
Ele não suporta python 3 (apenas instalado a partir de pip e erros de execução GOT)
Ohad Cohen
9

Para executar isso em versões posteriores do pip (testado pip==10.0.1), use o seguinte:

from pip._internal.operations.freeze import freeze
for requirement in freeze(local_only=True):
    print(requirement)
exuma
fonte
Qual é o status de interno ?. Entendo, pydoc pip._internalmas não consigo alcançá-lo em baixo help(pip._internal), pip .__ builtins_ etc. o guia de referência do pip também está em branco.
MortenB
1
Infelizmente eu não sei. Também não gosto de ser chamado _internal. Parece que a funcionalidade não está oficialmente exposta. Então você deve lidar com isso com cuidado!
exhuma
8

da linha de comando

python -c help('modules')

pode ser usado para visualizar todos os módulos e para módulos específicos

python -c help('os')

Para Linux abaixo funcionará

python -c "help('os')"
Npradhan
fonte
5
Isso funciona no Windows. No linux, lança-se um erro:-bash: syntax error near unexpected token `('
AjayKumarBasuthkar
Este módulo não lhe dá versões
Stepan Yakovenko
5

sim! você deve usar o pip como seu gerenciador de pacotes python ( http://pypi.python.org/pypi/pip )

com pacotes instalados pelo pip, você pode fazer uma

pip freeze

e listará todos os pacotes instalados. Você provavelmente também deve estar usando virtualenv e virtualenvwrapper . Quando você inicia um novo projeto, pode fazer

mkvirtualenv my_new_project

e então (dentro desse virtualenv), faça

pip install all_your_stuff

Dessa forma, você pode workon my_new_projecte depois pip freezever quais pacotes estão instalados para esse projeto / virtualenv.

por exemplo:

  ~  mkvirtualenv yo_dude
New python executable in yo_dude/bin/python
Installing setuptools............done.
Installing pip...............done.
virtualenvwrapper.user_scripts creating /Users/aaylward/dev/virtualenvs/yo_dude/bin/predeactivate
virtualenvwrapper.user_scripts creating /Users/aaylward/dev/virtualenvs/yo_dude/bin/postdeactivate
virtualenvwrapper.user_scripts creating /Users/aaylward/dev/virtualenvs/yo_dude/bin/preactivate
virtualenvwrapper.user_scripts creating /Users/aaylward/dev/virtualenvs/yo_dude/bin/postactivate
virtualenvwrapper.user_scripts creating /Users/aaylward/dev/virtualenvs/yo_dude/bin/get_env_details

(yo_dude)➜  ~  pip install django
Downloading/unpacking django
  Downloading Django-1.4.1.tar.gz (7.7Mb): 7.7Mb downloaded
  Running setup.py egg_info for package django

Installing collected packages: django
  Running setup.py install for django
    changing mode of build/scripts-2.7/django-admin.py from 644 to 755

    changing mode of /Users/aaylward/dev/virtualenvs/yo_dude/bin/django-admin.py to 755
Successfully installed django
Cleaning up...

(yo_dude)➜  ~  pip freeze
Django==1.4.1
wsgiref==0.1.2

(yo_dude)➜  ~  

ou se você tiver um pacote python com um arquivo requirements.pip,

mkvirtualenv my_awesome_project
pip install -r requirements.pip
pip freeze

fará o truque

Andbdrew
fonte
Ah, sim, eu uso o virtualenv há algum tempo. Só não sei como não descobri que posso usá pip-lo dessa maneira!
Jsalonen 17/10/12
Sobre virtualenvos pacotes de sites globais, você precisará usar pip list --local.
Ioannis Filippidis
@johntex você nunca deve usar pacotes globais de sites!
Andbdrew
Usar pacotes globais de sites é muito útil. Se não fosse, a opção não existiria virtualenv. Não conheço nenhum motivo para não usá-los e ninguém o impede de restringir o isolamento, virtualenvse preferir.
Ioannis Filippidis
Um ótimo motivo para não usá-los é que, quando você distribui ou implanta seu aplicativo ou programa, outras pessoas / servidores não terão seus pacotes de sites globais. Se você é a única pessoa que usa o aplicativo, faça o que quiser.
Andbdrew
5

Minha vez:

#!/usr/bin/env python3

import pkg_resources

dists = [str(d).replace(" ","==") for d in pkg_resources.working_set]
for i in dists:
    print(i)
alfredocambera
fonte
2

Aqui está uma maneira de fazer isso usando, em PYTHONPATHvez do caminho absoluto do seu diretório libs python:

for d in `echo "${PYTHONPATH}" | tr ':' '\n'`; do ls "${d}"; done

[ 10:43 Jonathan@MacBookPro-2 ~/xCode/Projects/Python for iOS/trunk/Python for iOS/Python for iOS ]$ for d in `echo "$PYTHONPATH" | tr ':' '\n'`; do ls "${d}"; done
libpython2.7.dylib pkgconfig          python2.7
BaseHTTPServer.py      _pyio.pyc              cgitb.pyo              doctest.pyo            htmlentitydefs.pyc     mimetools.pyc          plat-mac               runpy.py               stringold.pyc          traceback.pyo
BaseHTTPServer.pyc     _pyio.pyo              chunk.py               dumbdbm.py             htmlentitydefs.pyo     mimetools.pyo          platform.py            runpy.pyc              stringold.pyo          tty.py
BaseHTTPServer.pyo     _strptime.py           chunk.pyc              dumbdbm.pyc            htmllib.py             mimetypes.py           platform.pyc           runpy.pyo              stringprep.py          tty.pyc
Bastion.py             _strptime.pyc          chunk.pyo              dumbdbm.pyo            htmllib.pyc            mimetypes.pyc          platform.pyo           sched.py               stringprep.pyc         tty.pyo
Bastion.pyc            _strptime.pyo          cmd.py
....
chown
fonte
1

Se isso for necessário para executar a partir do python, você poderá invocar o subprocesso

from subprocess import PIPE, Popen

pip_process = Popen(["pip freeze"], stdout=PIPE,
                   stderr=PIPE, shell=True)
stdout, stderr = pip_process.communicate()
print(stdout.decode("utf-8"))
juftin
fonte