web-dev-qa-db-fra.com

Comment puis-je obtenir une liste des modules Python installés localement?

Je voudrais obtenir une liste des modules Python, qui sont dans mon installation Python (serveur UNIX).

Comment obtenir une liste des modules Python installés sur votre ordinateur?

help('modules')

dans un shell/une invite Python.

877
ChristopheD

Maintenant, ces méthodes, j’ai essayé moi-même et j’ai eu exactement ce qui était annoncé: tous les modules.

Hélas, vraiment vous ne vous souciez pas beaucoup de stdlib, vous savez ce que vous obtenez avec une installation en python. 

Vraiment, je veux les choses queIa installées. 

De manière surprenante, ce qui a vraiment bien fonctionné a été:

pip freeze

Qui a retourné:

Fabric==0.9.3
Apache-libcloud==0.4.0
bzr==2.3b4
distribute==0.6.14
docutils==0.7
greenlet==0.3.1
ipython==0.10.1
iterpipes==0.4
libxml2-python==2.6.21

Je dis "étonnamment" parce que l'outil d'installation du paquet est l'endroit exact où on s'attendrait à trouver cette fonctionnalité, bien que ce ne soit pas sous le nom 'freeze', mais le packaging en python est tellement bizarre que je suis sidéré que cet outil ait un sens. Pip 0.8.2, Python 2.7. 

241
chiggsy
  • Dans ipython vous pouvez taper "importTab".

  • Dans l'interpréteur Python standard, vous pouvez taper "help('modules')".

  • Sur la ligne de commande, vous pouvez utiliser pydocmodules.

  • Dans un script, appelez pkgutil.iter_modules() .

80
Johnsyweb

Depuis la version 1.3 de pip, vous avez accès à:

pip list

Ce qui semble être du sucre syntaxique pour "pip gel". Il listera tous les modules spécifiques à votre installation ou virtualenv, ainsi que leurs numéros de version. Malheureusement, il n’affiche ni le numéro de version actuel d’un module, ni la vaisselle ni les chaussures.

71
Bryce

Je viens de l'utiliser pour voir les modules actuellement utilisés:

import sys as s
s.modules.keys()

qui montre tous les modules fonctionnant sur votre python.

Pour tous les modules intégrés, utilisez:

s.modules

Ce qui est un dict contenant tous les modules et objets d'importation.

58
Dan Evans

Dans Shell normal, il suffit d'utiliser

pydoc modules
58
DrkNess

À partir du pip 10, la réponse acceptée ne fonctionnera plus. L’équipe de développement a supprimé l’accès à la routine get_installed_distributions. Il existe une fonction alternative dans la variable setuptools pour faire la même chose. Voici une version alternative qui fonctionne avec le pip 10:

import pkg_resources
installed_packages = pkg_resources.working_set
installed_packages_list = sorted(["%s==%s" % (i.key, i.version)
     for i in installed_packages])
print(installed_packages_list)

Faites-moi savoir s'il fonctionnera ou non dans les versions précédentes de pip également.

22
Big_Al_Tx

Si nous devons répertorier les packages installés dans le shell Python, nous pouvons utiliser la commande help comme suit:

>>help('modules package')
21
Sadheesh

J'ai rencontré un python 2.7 personnalisé installé sur OS X. X11 devait répertorier les modules installés (à l'aide de help et de pydoc).

Pour pouvoir lister tous les modules sans installer X11, j’ai exécuté pydoc en tant que serveur http, c’est-à-dire:

pydoc -p 12345

Ensuite, il est possible de diriger Safari vers http://localhost:12345/ pour voir tous les modules.

11
Qiau

Recherche très simple avec pkgutil.iter_modules

from pkgutil import iter_modules
a=iter_modules()
while True:
    try: x=a.next()
    except: break
    if 'searchstr' in x[1]: print x[1]
10
stuudent

sur windows, entrez ceci en cmd

c:\python\libs>python -m pip freeze
9
Saurabh

J'utilise normalement pip list pour obtenir une liste de paquets (avec la version).

Cela fonctionne également dans un environnement virtuel.

8
James

En plus d'utiliser pip freeze, j'ai installé yolk dans mes environnements virtuels.

7
jdsantiagojr

Cette solution est principalement basée sur les modules importlib et pkgutil et fonctionne avec CPython 3.4 et CPython 3.5, mais ne prend pas en charge CPython 2.


Explication

  1. sys.builtin_module_names - nomme tous les modules intégrés (regardez ma réponse ici )
  2. pkgutil.iter_modules() - renvoie une information sur tous les modules disponibles
  3. importlib.util.find_spec() - renvoie une information sur l'importation du module, s'il existe
  4. BuiltinImporter - un importateur de modules intégrés ( docs )
  5. SourceFileLoader - un importateur pour un module Python standard (par défaut, l'extension * .py) ( docs )
  6. ExtensionFileLoader - un importateur de modules en tant que bibliothèque partagée (écrit en C ou C++)

Code complet

import sys
import os
import shutil
import pkgutil
import importlib
import collections

if sys.version_info.major == 2:
    raise NotImplementedError('CPython 2 is not supported yet')


def main():

    # name this file (module)
    this_module_name = os.path.basename(__file__).rsplit('.')[0]

    # dict for loaders with their modules
    loaders = collections.OrderedDict()

    # names`s of build-in modules
    for module_name in sys.builtin_module_names:

        # find an information about a module by name
        module = importlib.util.find_spec(module_name)

        # add a key about a loader in the dict, if not exists yet
        if module.loader not in loaders:
            loaders[module.loader] = []

        # add a name and a location about imported module in the dict
        loaders[module.loader].append((module.name, module.Origin))

    # all available non-build-in modules
    for module_name in pkgutil.iter_modules():

        # ignore this module
        if this_module_name == module_name[1]:
            continue

        # find an information about a module by name
        module = importlib.util.find_spec(module_name[1])

        # add a key about a loader in the dict, if not exists yet
        loader = type(module.loader)
        if loader not in loaders:
            loaders[loader] = []

        # add a name and a location about imported module in the dict
        loaders[loader].append((module.name, module.Origin))

    # pretty print
    line = '-' * shutil.get_terminal_size().columns
    for loader, modules in loaders.items():
        print('{0}\n{1}: {2}\n{0}'.format(line, len(modules), loader))
        for module in modules:
            print('{0:30} | {1}'.format(module[0], module[1]))


if __== '__main__':
    main()

Utilisation

Pour le CPython3.5 (tronqué)

$ python3.5 python_modules_info.py 
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
30: <class '_frozen_importlib.BuiltinImporter'>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
_ast                           | built-in
_codecs                        | built-in
_collections                   | built-in
_functools                     | built-in
_imp                           | None
_io                            | built-in
_locale                        | built-in
_operator                      | built-in
_signal                        | built-in
_sre                           | built-in
_stat                          | built-in
_string                        | built-in
_symtable                      | built-in
_thread                        | built-in
(****************************truncated*******************************)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
227: <class '_frozen_importlib_external.SourceFileLoader'>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
__future__                     | /usr/local/lib/python3.5/__future__.py
_bootlocale                    | /usr/local/lib/python3.5/_bootlocale.py
_collections_abc               | /usr/local/lib/python3.5/_collections_abc.py
_compat_pickle                 | /usr/local/lib/python3.5/_compat_pickle.py
_compression                   | /usr/local/lib/python3.5/_compression.py
_dummy_thread                  | /usr/local/lib/python3.5/_dummy_thread.py
_markupbase                    | /usr/local/lib/python3.5/_markupbase.py
_osx_support                   | /usr/local/lib/python3.5/_osx_support.py
_pydecimal                     | /usr/local/lib/python3.5/_pydecimal.py
_pyio                          | /usr/local/lib/python3.5/_pyio.py
_sitebuiltins                  | /usr/local/lib/python3.5/_sitebuiltins.py
(****************************truncated*******************************)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
64: <class '_frozen_importlib_external.ExtensionFileLoader'>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
_bisect                        | /usr/local/lib/python3.5/lib-dynload/_bisect.cpython-35m-x86_64-linux-gnu.so
_bz2                           | /usr/local/lib/python3.5/lib-dynload/_bz2.cpython-35m-x86_64-linux-gnu.so
_codecs_cn                     | /usr/local/lib/python3.5/lib-dynload/_codecs_cn.cpython-35m-x86_64-linux-gnu.so
_codecs_hk                     | /usr/local/lib/python3.5/lib-dynload/_codecs_hk.cpython-35m-x86_64-linux-gnu.so
_codecs_iso2022                | /usr/local/lib/python3.5/lib-dynload/_codecs_iso2022.cpython-35m-x86_64-linux-gnu.so
(****************************truncated*******************************)

Pour le CPython3.4 (tronqué)

$ python3.4 python_modules_info.py
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
54: <class '_frozen_importlib.BuiltinImporter'>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
_ast                           | built-in
_bisect                        | built-in
_codecs                        | built-in
_collections                   | built-in
_datetime                      | built-in
_elementtree                   | built-in
_functools                     | built-in
_heapq                         | built-in
_imp                           | None
_io                            | built-in
_locale                        | built-in
_md5                           | built-in
_operator                      | built-in
_pickle                        | built-in
_posixsubprocess               | built-in
_random                        | built-in
(****************************truncated*******************************)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
246: <class '_frozen_importlib.SourceFileLoader'>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
__future__                     | /usr/lib/python3.4/__future__.py
_bootlocale                    | /usr/lib/python3.4/_bootlocale.py
_collections_abc               | /usr/lib/python3.4/_collections_abc.py
_compat_pickle                 | /usr/lib/python3.4/_compat_pickle.py
_dummy_thread                  | /usr/lib/python3.4/_dummy_thread.py
_markupbase                    | /usr/lib/python3.4/_markupbase.py
_osx_support                   | /usr/lib/python3.4/_osx_support.py
_pyio                          | /usr/lib/python3.4/_pyio.py
(****************************truncated*******************************)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
44: <class '_frozen_importlib.ExtensionFileLoader'>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
_bz2                           | /usr/lib/python3.4/lib-dynload/_bz2.cpython-34m-x86_64-linux-gnu.so
_codecs_cn                     | /usr/lib/python3.4/lib-dynload/_codecs_cn.cpython-34m-x86_64-linux-gnu.so
_codecs_hk                     | /usr/lib/python3.4/lib-dynload/_codecs_hk.cpython-34m-x86_64-linux-gnu.so
_codecs_iso2022                | /usr/lib/python3.4/lib-dynload/_codecs_iso2022.cpython-34m-x86_64-linux-gnu.so
_codecs_jp                     | /usr/lib/python3.4/lib-dynload/_codecs_jp.cpython-34m-x86_64-linux-gnu.so
_codecs_kr                     | /usr/lib/python3.4/lib-dynload/_codecs_kr.cpython-34m-x86_64-linux-gnu.so
_codecs_tw                     | /usr/lib/python3.4/lib-dynload/_codecs_tw.cpython-34m-x86_64-linux-gnu.so
_crypt                         | /usr/lib/python3.4/lib-dynload/_crypt.cpython-34m-x86_64-linux-gnu.so
(****************************truncated*******************************)
6
Seti Volkylany
  1. pour obtenir tous les modules disponibles, lancez sys.modules
  2. pour obtenir tous les modules installed modules (lire: installé par pip), vous pouvez regarder pip.get_installed_distributions()

Pour le deuxième but, exemple de code:

import pip
for package in pip.get_installed_distributions():
    name = package.project_name # SQLAlchemy, Django, Flask-OAuthlib
    key = package.key # sqlalchemy, Django, flask-oauthlib
    module_name = package._get_metadata("top_level.txt") # sqlalchemy, Django, flask_oauthlib
    location = package.location # virtualenv lib directory etc.
    version = package.version # version number
6
yegle

pip freeze cherche-t-il tous les packages, mais vous pouvez simplement écrire la commande suivante pour répertorier tous les chemins où se trouvent les packages Python.

>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']
4
Pavan Gupta

Essayez ces

pip list

ou

pip freeze
3
Amit Gupta

Cela a été inspiré par Adam/Matan réponse (le accepté):

import tabulate
try:
  from pip import get_installed_distributions
except:
  from pip._internal.utils.misc import get_installed_distributions

tabpackages = []
for _, package in sorted([('%s %s' % (i.location, i.key), i) for i in get_installed_distributions()]):
  tabpackages.append([package.location, package.key, package.version])

print(tabulate.tabulate(tabpackages))

qui imprime ensuite un tableau sous la forme de

19:33 pi@rpi-v3 [iot-wifi-2] ~/python$ python installed_packages.py
-------------------------------------------  --------------  ------
/home/pi/.local/lib/python2.7/site-packages  enum-compat     0.0.2
/home/pi/.local/lib/python2.7/site-packages  enum34          1.1.6
/home/pi/.local/lib/python2.7/site-packages  pexpect         4.2.1
/home/pi/.local/lib/python2.7/site-packages  ptyprocess      0.5.2
/home/pi/.local/lib/python2.7/site-packages  pygatt          3.2.0
/home/pi/.local/lib/python2.7/site-packages  pyserial        3.4
/usr/local/lib/python2.7/dist-packages       bluepy          1.1.1
/usr/local/lib/python2.7/dist-packages       click           6.7
/usr/local/lib/python2.7/dist-packages       click-datetime  0.2
/usr/local/lib/python2.7/dist-packages       construct       2.8.21
/usr/local/lib/python2.7/dist-packages       pyaudio         0.2.11
/usr/local/lib/python2.7/dist-packages       tabulate        0.8.2
-------------------------------------------  --------------  ------

ce qui vous permet ensuite de discerner facilement les paquets que vous avez installés avec et sans Sudo.


Une remarque à part: j'ai remarqué que lorsque j'installe un paquet une fois via Sudo et une fois sans, l'un est prioritaire afin que l'autre ne soit pas répertorié (un seul emplacement est affiché). Je crois que seul celui du répertoire local est alors répertorié. Cela pourrait être amélioré.

3
Daniel F

Si vous avez une distribution anaconda python installée, vous pouvez également utiliser

$conda list

en plus des solutions décrites ci-dessus.

3
Shreyas

Il y a beaucoup d'idées, au départ, je réfléchis à ces deux choses:

pip

les inconvénients: pas toujours installé

help ('modules')

inconvénients: sortie sur console; avec des modules cassés (voir ubuntu ...) peut segfault

J'ai besoin d'une approche simple, utilisant des bibliothèques de base et compatible avec l'ancien python 2.x

Et je vois la lumière: listmodules.py

Caché dans le répertoire source de la documentation en 2.5 se trouve un petit script qui répertorie tous les modules disponibles pour une installation Python.

Avantages:

utilise seulement imp, sys, os, re, time} _

conçu pour fonctionner sur Python 1.5.2 et plus récent

le code source est vraiment compact, vous pouvez donc le bricoler facilement, par exemple pour passer une liste d'exceptions de modules buggy (n'essayez pas de les importer)

2
Massimo

Il y a plusieurs façons de peler un chat.

  • Le moyen le plus simple consiste à utiliser la fonction pydoc directement à partir du shell avec:
    pydoc modules

  • Mais pour plus d’informations, utilisez l’outil appelé pip-date qui vous indique également les dates d’installation.
    pip install pip-date


 enter image description here

1
not2qubit

J'avais besoin de trouver la version spécifique des packages disponibles par défaut dans AWS Lambda. Je l'ai fait avec un mashup d'idées de cette page. Je le partage pour la postérité.

import pkgutil

__version__ = '0.1.1'

def get_ver(name):
    try:
        return str(__import__(name).__version__)
    except:
        return None

def lambda_handler(event, context):
    return {
        'statusCode': 200,
        'body': [{
                   'path': m.module_Finder.path,
                   'name': m.name,
                   'version': get_ver(m.name),
                 } for m in list(pkgutil.iter_modules())
                 #if m.module_Finder.path == "/var/runtime" # Uncomment this if you only care about a certain path
                ],
    }

Ce que j'ai découvert, c'est que la bibliothèque fournie boto3 était dépassée et que ce n'était pas de ma faute si mon code échouait. J'avais juste besoin d'ajouter boto3 et botocore à mon projet. Mais sans cela, je me serais cogné la tête en pensant que mon code était mauvais.

{
  "statusCode": 200,
  "body": [
    {
      "path": "/var/task",
      "name": "lambda_function",
      "version": "0.1.1"
    },
    {
      "path": "/var/runtime",
      "name": "bootstrap",
      "version": null
    },
    {
      "path": "/var/runtime",
      "name": "boto3",
      "version": "1.9.42"
    },
    {
      "path": "/var/runtime",
      "name": "botocore",
      "version": "1.12.42"
    },
    {
      "path": "/var/runtime",
      "name": "dateutil",
      "version": "2.7.5"
    },
    {
      "path": "/var/runtime",
      "name": "docutils",
      "version": "0.14"
    },
    {
      "path": "/var/runtime",
      "name": "jmespath",
      "version": "0.9.3"
    },
    {
      "path": "/var/runtime",
      "name": "lambda_runtime_client",
      "version": null
    },
    {
      "path": "/var/runtime",
      "name": "lambda_runtime_exception",
      "version": null
    },
    {
      "path": "/var/runtime",
      "name": "lambda_runtime_marshaller",
      "version": null
    },
    {
      "path": "/var/runtime",
      "name": "s3transfer",
      "version": "0.1.13"
    },
    {
      "path": "/var/runtime",
      "name": "six",
      "version": "1.11.0"
    },
    {
      "path": "/var/runtime",
      "name": "test_bootstrap",
      "version": null
    },
    {
      "path": "/var/runtime",
      "name": "test_lambda_runtime_client",
      "version": null
    },
    {
      "path": "/var/runtime",
      "name": "test_lambda_runtime_marshaller",
      "version": null
    },
    {
      "path": "/var/runtime",
      "name": "urllib3",
      "version": "1.24.1"
    },
    {
      "path": "/var/lang/lib/python3.7",
      "name": "__future__",
      "version": null
    },
...

Ce que j'ai découvert était aussi différent de ce qu'ils publient officiellement . Au moment d'écrire ceci:

  • Système d'exploitation - Amazon Linux
  • AMI - amzn-AMI-hvm-2017.03.1.20170812-x86_64-gp2
  • Noyau Linux - 4.14.77-70.59.amzn1.x86_64
  • AWS SDK for JavaScript - 2.290.0 \
  • SDK pour Python (Boto 3) - 3-1.7.74 botocore-1.10.74
0
Bruno Bronosky

CA aidera

En terminal ou IPython, tapez:

help('modules')

puis

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
0
X Personified

Pour ceux qui se demandent comment appeler pip list depuis un programme Python, vous pouvez utiliser les éléments suivants:

import pip
pip.main(['list])  # this will print all the packages
0
Marcelo Villa