¿Cómo enumerar todos los paquetes instalados y sus versiones en Python?

Respuestas:

196

Si tiene una instalación de pip y desea ver qué paquetes se han instalado con sus herramientas de instalación, simplemente puede llamar a esto:

pip freeze

También incluirá números de versión para los paquetes instalados.

Actualizar

pip se ha actualizado para producir también la misma salida que pip freezellamando a:

pip list

Nota

El resultado de pip listtiene un formato diferente, por lo que si tiene algún script de shell que analiza el resultado (tal vez para obtener el número de versión) freezey desea cambiar su script para llamar list, deberá cambiar su código de análisis.

Jeff LaFay
fuente
9
En mi humilde opinión, deben proporcionar pip listcomo un alias para pip freeze. Es intuitivo escribir pip freeze > requirements.txt, pero no pip freeze.
jsalonen
3
WOW: Acabo de mirar la documentación de la última versión de pip y parece que han agregado pip list: pip-installer.org/en/latest/usage.html#pip-list , ¡así que esto es algo que ya viene!
jsalonen
51

help('modules') debería hacerlo por ti.

en 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
fuente
55
Eso es útil! Sin embargo, me encantaría ver las versiones también.
jsalonen
44
Creo que el problema es theres no estandarizados forma de incluir la versión ... a veces es Package.version()o package.__version__o package.vero cualquier número de otras posibilidades
Joran Beasley
Pensé que el lema de Python era "solo hay una forma de hacerlo";)?
Ed Randall el
3
@EdRandall, no, es "una forma obvia de hacerlo". Siempre hay una manera no obvia. Además, la redacción exacta es: debe haber una, y preferiblemente solo una, forma obvia de hacerlo. Aunque esa manera puede no ser obvia al principio a menos que seas holandés.
rosuav
30

Si desea obtener información sobre sus distribuciones de python instaladas y no desea usar su consola o terminal cmd para ello, sino a través del código de python, puede usar el siguiente código (probado con python 3.4):

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

La pip.get_installed_distributions(local_only=True)llamada a la función devuelve un iterable y debido a la función for-loop y la función de impresión, los elementos contenidos en el iterable se imprimen separados por nuevos caracteres de línea ( \n). El resultado (dependiendo de sus distribuciones instaladas) se verá así:

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...
escarchado
fuente
44
Para ampliar el comentario de @ exhuma, con el pip 10 debe usar: import pkg_resources [print (d.project_name) for d in pkg_resources.working_set]
Almenon
¿Cuál es el estado de pkg_resources? AFAICR esto es parte de setuptools. No pip. ¿Podemos suponer con seguridad que setuptoolssiempre estará disponible, solo dependiendo pip?
exhuma
9

Puedes probar: Yema

Para instalar la yema, intente:

easy_install yolk

Yolk es una herramienta de Python para obtener información sobre paquetes de Python instalados y consultar paquetes disponibles en PyPI (Índice de paquetes de Python).

Puede ver qué paquetes están activos, no activos o en modo de desarrollo y mostrarle qué versiones más nuevas están disponibles consultando PyPI.

llazzaro
fuente
Por lo general, utilizo pip para esta tarea en este momento, pero tengo un proyecto muy antiguo que no estoy listo para agregar, y recordé que había una herramienta como esta. Sin embargo, no podía recordar cómo se llamaba ... ¡Esto era!
meshantz
1
No es compatible con Python 3 (recién instalado desde pip y tengo errores de tiempo de ejecución)
Ohad Cohen
9

Para ejecutar esto en versiones posteriores de pip (probado pip==10.0.1) use lo siguiente:

from pip._internal.operations.freeze import freeze
for requirement in freeze(local_only=True):
    print(requirement)
exhuma
fuente
¿Cuál es el estado de interno? Ya veo pydoc pip._internalpero no puedo alcanzarlo debajo help(pip._internal), pip .__ builtins_ etc. la guía de referencia de pip también está en blanco.
MortenB
1
Lamentablemente no lo sé. No me gusta que se llame _internaltampoco. Parece que la funcionalidad no está oficialmente expuesta. ¡Entonces debes manejar esto con cuidado!
exhuma
8

desde la línea de comando

python -c help('modules')

se puede usar para ver todos los módulos y para módulos específicos

python -c help('os')

Para Linux a continuación funcionará

python -c "help('os')"
Npradhan
fuente
55
Esto funciona en windows. En Linux arroja un error:-bash: syntax error near unexpected token `('
AjayKumarBasuthkar
esto no da versiones de módulos
Stepan Yakovenko
5

¡si! debe usar pip como administrador de paquetes de python ( http://pypi.python.org/pypi/pip )

con paquetes instalados pip, puede hacer un

pip freeze

y enumerará todos los paquetes instalados. Probablemente también deberías estar usando virtualenv y virtualenvwrapper . Cuando comienzas un nuevo proyecto, puedes hacer

mkvirtualenv my_new_project

y luego (dentro de ese virtualenv), hacer

pip install all_your_stuff

De esta manera, puede workon my_new_projecty luego pip freezever qué paquetes están instalados para ese virtualenv / proyecto.

por ejemplo:

  ~  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)➜  ~  

o si tiene un paquete de Python con un archivo require.pip,

mkvirtualenv my_awesome_project
pip install -r requirements.pip
pip freeze

hará el truco

Andbdrew
fuente
Oh sí, he estado usando virtualenv en realidad por algún tiempo. ¡Simplemente no sé cómo no descubrí que puedo usarlo pipde esta manera!
jsalonen
Acerca virtualenvde los paquetes de sitios globales, entonces debe usarlos pip list --local.
Ioannis Filippidis
@johntex ¡nunca deberías usar paquetes de sitio globales!
Andbdrew
Usar paquetes de sitios globales es muy útil. Si no fuera así, la opción no existiría en absoluto virtualenv. No conozco ninguna razón para no usarlos, y nadie le impide restringir a aislados virtualenvsi lo prefiere.
Ioannis Filippidis
Una gran razón para no usarlos es que cuando distribuye o implementa su aplicación o programa, otras personas / servidores no tendrán sus paquetes de sitio global. Si eres la única persona que usa la aplicación, haz lo que quieras.
Andbdrew
5

Mi toma:

#!/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
fuente
2

Aquí hay una manera de hacerlo usando en PYTHONPATHlugar de la ruta absoluta de su directorio de libs de 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
fuente
1

Si esto es necesario para ejecutar desde Python, puede invocar un subproceso

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
fuente