Comment lister tous les packages installés et leurs versions en Python?

128

Existe-t-il un moyen en Python de répertorier tous les packages installés et leurs versions?

Je sais que je peux aller à l'intérieur python/Lib/site-packageset voir quels fichiers et répertoires existent, mais je trouve cela très gênant. Ce que je recherche quelque chose qui est similaire à npm listie npm-ls .

jsalonen
la source

Réponses:

196

Si vous avez pip install et que vous souhaitez voir quels packages ont été installés avec vos outils d'installation, vous pouvez simplement appeler ceci:

pip freeze

Il inclura également les numéros de version des packages installés.

Mettre à jour

pip a été mis à jour pour produire également la même sortie qu'en pip freezeappelant:

pip list

Remarque

La sortie de pip listest formatée différemment, donc si vous avez un script shell qui analyse la sortie (peut-être pour saisir le numéro de version) de freezeet que vous voulez changer votre script pour appeler list, vous devrez changer votre code d'analyse.

Jeff LaFay
la source
9
IMHO ils devraient fournir pip listcomme alias pour pip freeze. C'est intuitif à écrire pip freeze > requirements.txt, mais pas pip freeze.
jsalonen
3
WOW: Je viens de regarder dans la documentation de la dernière version de pip et il semble qu'ils aient ajouté pip list: pip-installer.org/en/latest/usage.html#pip-list - donc c'est en fait quelque chose qui arrive déjà!
jsalonen
51

help('modules') devrait le faire pour vous.

dans 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
la source
5
C'est pratique! J'adorerais aussi voir les versions.
jsalonen
4
Je pense que le problème est qu'il n'y a pas de manière standardisée d'inclure la version ... parfois son Package.version()ou package.__version__ou package.verou un certain nombre d'autres possibilités
Joran Beasley
Je pensais que la devise de python était "il n'y a qu'une seule façon de le faire";)?
Ed Randall
3
@EdRandall, non - c'est "une manière évidente de le faire". Il y a toujours une manière non évidente. En outre, le libellé exact est: Il devrait y avoir une - et de préférence une seule - façon évidente de le faire. Bien que cette manière ne soit pas évidente au début, sauf si vous êtes néerlandais.
rosuav
30

Si vous souhaitez obtenir des informations sur vos distributions python installées et que vous ne souhaitez pas utiliser votre console ou terminal cmd pour cela, mais plutôt via du code python, vous pouvez utiliser le code suivant (testé avec python 3.4):

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

L' pip.get_installed_distributions(local_only=True)appel de fonction renvoie un itérable et en raison de la boucle for et de la fonction d'impression, les éléments contenus dans l'itérable sont imprimés séparés par des caractères de nouvelle ligne ( \n). Le résultat ressemblera (en fonction de vos distributions installées) à ceci:

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...
glacial
la source
4
Pour développer le commentaire de @ exhuma, avec pip 10, vous devez utiliser: import pkg_resources [print (d.project_name) for d dans pkg_resources.working_set]
Almenon
Quel est l'état de pkg_resources? AFAICR dont cela fait partie setuptools. Non pip. Peut - on en toute sécurité suppose que setuptoolssera toujours disponible EHEN uniquement en fonction pip?
exhuma le
9

Vous pouvez essayer: Yolk

Pour installer Yolk, essayez:

easy_install yolk

Yolk est un outil Python permettant d'obtenir des informations sur les packages Python installés et d'interroger les packages disponibles sur PyPI (Python Package Index).

Vous pouvez voir quels packages sont actifs, non actifs ou en mode développement et vous montrer quelles versions plus récentes sont disponibles en interrogeant PyPI.

Llazzaro
la source
J'utilise habituellement pip pour cette tâche à ce stade, mais j'ai un très vieux projet dans lequel je ne suis pas prêt à ajouter une distribution, et je me suis souvenu qu'il y avait un outil comme celui-ci. Je ne me souvenais pas de comment il s'appelait ... C'était ça!
meshantz
1
Il ne prend pas en charge python 3 (vient d'être installé à partir de pip et a des erreurs d'exécution)
Ohad Cohen
9

Pour l'exécuter dans les versions ultérieures de pip (testé sur pip==10.0.1), utilisez ce qui suit:

from pip._internal.operations.freeze import freeze
for requirement in freeze(local_only=True):
    print(requirement)
exhuma
la source
Quel est le statut de l' interne ?. Je vois pydoc pip._internalmais je ne peux pas l'atteindre dessous help(pip._internal), pip .__ builtins_ etc. Le guide de référence de pip est également vide.
MortenB
1
Malheureusement je ne sais pas. Je n'aime pas non plus qu'on l'appelle _internal. Il semble que la fonctionnalité ne soit pas officiellement exposée. Vous devez donc gérer cela avec précaution!
exhuma le
8

depuis la ligne de commande

python -c help('modules')

peut être utilisé pour afficher tous les modules et pour des modules spécifiques

python -c help('os')

Pour Linux ci-dessous fonctionnera

python -c "help('os')"
Npradhan
la source
5
Cela fonctionne sur Windows. Sous Linux, il génère une erreur:-bash: syntax error near unexpected token `('
AjayKumarBasuthkar
cela ne donne pas de versions de modules
Stepan Yakovenko
5

Oui! vous devriez utiliser pip comme gestionnaire de paquets python ( http://pypi.python.org/pypi/pip )

avec les packages installés par pip, vous pouvez faire un

pip freeze

et il listera tous les packages installés. Vous devriez probablement également utiliser virtualenv et virtualenvwrapper . Lorsque vous démarrez un nouveau projet, vous pouvez faire

mkvirtualenv my_new_project

et puis (dans ce virtualenv), faites

pip install all_your_stuff

De cette façon, vous pouvez workon my_new_projectpuis pip freezevoir quels paquets sont installés pour que virtualenv / projet.

par exemple:

  ~  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 si vous avez un package python avec un fichier requirements.pip,

mkvirtualenv my_awesome_project
pip install -r requirements.pip
pip freeze

fera l'affaire

Andbdrew
la source
Oh ouais, j'utilise virtualenv depuis un certain temps. Je ne sais simplement pas comment je n'ai pas compris que je pouvais l'utiliser pipde cette manière!
jsalonen
À propos virtualenvdes packages de site global, vous devez ensuite utiliser pip list --local.
Ioannis Filippidis
@johntex, vous ne devez jamais utiliser de packages de sites globaux!
Andbdrew
L'utilisation de packages de sites globaux est très utile. Si ce n'était pas le cas, l'option n'existerait pas du tout virtualenv. Je n'ai connaissance d'aucune raison pour ne pas les utiliser, et personne ne vous empêche de vous limiter à isolé virtualenvsi vous préférez.
Ioannis Filippidis
Une bonne raison de ne pas les utiliser est que lorsque vous distribuez ou déployez votre application ou programme, d'autres personnes / serveurs n'auront pas vos packages de site global. Si vous êtes la seule personne à utiliser l'application, faites ce que vous voulez.
Andbdrew
5

Ma prise:

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

Voici un moyen de le faire en utilisant PYTHONPATHau lieu du chemin absolu de votre répertoire python libs:

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
la source
1

Si cela est nécessaire pour exécuter à partir de python, vous pouvez simplement appeler un sous-processus

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
la source