Question

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

Comment pouvez-vous obtenir une liste des modules Python installés dans votre ordinateur?

Était-ce utile?

La solution

Solution

Ne pas utiliser avec pip> 10.0

Mes 50 cents pour obtenir une liste semblable à pip freeze à partir d'un script Python:

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

En tant que (trop longue) une doublure:

sorted(["%s==%s" % (i.key, i.version) for i in pip.get_installed_distributions()])

Giving:

['behave==1.2.4', 'enum34==1.0', 'flask==0.10.1', 'itsdangerous==0.24', 
 'jinja2==2.7.2', 'jsonschema==2.3.0', 'markupsafe==0.23', 'nose==1.3.3', 
 'parse-type==0.3.4', 'parse==1.6.4', 'prettytable==0.7.2', 'requests==2.3.0',
 'six==1.6.1', 'vioozer-metadata==0.1', 'vioozer-users-server==0.1', 
 'werkzeug==0.9.4']

Portée

Cette solution applique à la portée du système ou à un champ d'environnement virtuel, et couvre les paquets installés par setuptools, et pip ( dieu ne plaise) easy_install.

Mon cas d'utilisation

J'ai ajouté le résultat de cet appel à mon serveur de flacon, alors quand je l'appelle avec http://example.com/exampleServer/environment je reçois la liste des paquets installés sur virtualenv du serveur. Il rend le débogage beaucoup plus facile.

Avertissements

Je l'ai remarqué un comportement étrange de cette technique - lorsque l'interpréteur Python est appelé dans le même répertoire en tant que fichier setup.py, il ne répertorie pas le paquet installé par setup.py

.

Étapes pour reproduire:

Créer un environnement virtuel
$ cd /tmp
$ virtualenv test_env
New python executable in test_env/bin/python
Installing setuptools, pip...done.
$ source test_env/bin/activate
(test_env) $ 
Cloner un git avec setup.py
(test_env) $ git clone https://github.com/behave/behave.git
Cloning into 'behave'...
remote: Reusing existing pack: 4350, done.
remote: Total 4350 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (4350/4350), 1.85 MiB | 418.00 KiB/s, done.
Resolving deltas: 100% (2388/2388), done.
Checking connectivity... done.

Nous avons la setup.py de /tmp/behave se comportent:

(test_env) $ ls /tmp/behave/setup.py
/tmp/behave/setup.py
Installer le paquet de python de la git
(test_env) $ cd /tmp/behave && pip install . 
running install
...
Installed /private/tmp/test_env/lib/python2.7/site-packages/enum34-1.0-py2.7.egg
Finished processing dependencies for behave==1.2.5a1

Si nous courons la solution mentionnée ci-dessus à partir /tmp

>>> import pip
>>> sorted(["%s==%s" % (i.key, i.version) for i in pip.get_installed_distributions()])
['behave==1.2.5a1', 'enum34==1.0', 'parse-type==0.3.4', 'parse==1.6.4', 'six==1.6.1']
>>> import os
>>> os.getcwd()
'/private/tmp'

Si nous courons la solution mentionnée ci-dessus à partir /tmp/behave

>>> import pip
>>> sorted(["%s==%s" % (i.key, i.version) for i in pip.get_installed_distributions()])
['enum34==1.0', 'parse-type==0.3.4', 'parse==1.6.4', 'six==1.6.1']
>>> import os
>>> os.getcwd()
'/private/tmp/behave'

behave==1.2.5a1 est absent du deuxième exemple, parce que le répertoire de travail contient le fichier behave de setup.py.

Je ne pouvais trouver aucune référence à cette question dans la documentation. Peut-être que j'ouvrir un bug pour elle.

Autres conseils

help('modules')

dans un shell Python / prompt.

Maintenant, ces méthodes que je me suis essayé, et je me suis exactement ce qui a été annoncé: Tous les modules

.

Hélas, vraiment vous ne se soucient pas beaucoup sur le stdlib, vous savez ce que vous obtenez avec un python installer.

Vraiment, je veux que les choses que I installé.

Ce qui en fait, de façon surprenante, fonctionnait très bien était:

pip freeze

Ce qui est 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 le package outil d'installation est l'endroit exact on pouvait s'y attendre à trouver cette fonctionnalité, mais pas sous le nom de « geler », mais l'emballage python est tellement bizarre, que je suis sidéré que cet outil est logique. Pip 0.8.2, Python 2.7.

  • ipython vous pouvez taper "import Tab ".

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

  • A la ligne de commande, vous pouvez utiliser pydoc modules.

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

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

pip list

Ce qui semble être le sucre syntaxique pour « gel pip ». Il liste tous les modules particuliers à votre installation ou virtualenv, ainsi que leurs numéros de version. Malheureusement, il ne montre pas le numéro de version d'un module, ni ne lavez votre vaisselle ou briller vos chaussures.

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

import sys as s
s.modules.keys()

qui montre tous les modules en cours d'exécution sur votre python.

Pour tous les modules intégrés utilisent:

s.modules

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

En shell normal il suffit d'utiliser

pydoc modules

Au pip 10, la réponse acceptée ne fonctionnera plus. L'équipe de développement a supprimé l'accès à la routine de get_installed_distributions. Il y a une autre fonction dans le setuptools pour faire la même chose. Voici une autre version qui fonctionne avec 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)

S'il vous plaît laissez-moi savoir si elle ou ne fonctionnera pas dans les versions précédentes de pépin, aussi.

Si nous devons lister les paquets installés dans le shell Python, nous pouvons utiliser la commande help comme suit

>>help('modules package')

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

Cela fonctionne dans un environnement virtuel aussi, bien sûr. Pour montrer ce qui est installé uniquement dans l'environnement virtuel (pas des packages globaux), utilisez pip list --local.

est ici la documentation montrant toutes les options disponibles pip list, avec plusieurs bons exemples .

Très simple recherche à l'aide 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]

Je suis tombé sur un python installé sur mesure 2.7 sur OS X. Il a fallu X11 à la liste des modules installés (à la fois en utilisant l'aide et pydoc).

Pour pouvoir répertorier tous les modules sans installer X11 j'ai couru pydoc comme serveur http, i.e.:.

pydoc -p 12345

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

sur les fenêtres, entrez cmd

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

a été inspiré par répondre (l'une acceptée):

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 une table 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
-------------------------------------------  --------------  ------

qui vous permet ensuite facilement discerner que vous les paquets installés avec et sans sudo.


Une note de côté: je l'ai remarqué que lorsque j'installe un paquet une fois par sudo et une fois sans, on a priorité pour que l'autre ne soit pas Cotée (un seul emplacement est indiqué). Je crois que seul l'un dans le répertoire local est alors répertorié. Cela pourrait être améliorée.

En plus d'utiliser pip freeze j'installons jaune dans mes environnements virtuels.

  1. pour obtenir tous les modules disponibles, exécutez sys.modules
  2. pour obtenir tous les installé modules (lire: installé par pip), vous pouvez regarder pip.get_installed_distributions()

Pour le deuxième but, par exemple le code suivant:

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

Cette solution est basée sur des modules primaire importlib et pkgutil et travailler avec CPython 3.4 et 3.5 CPython, mais n'a pas de support pour le CPython 2.


Explication

  1. sys.builtin_module_names - noms de tous les modules intégrés (regardez ma réponse )
  2. pkgutil.iter_modules() - retourne une information sur tous les modules disponibles
  3. importlib.util.find_spec() - retourne une information sur le module d'importation, si elle existe
  4. BuiltinImporter - un fournisseur pour les modules intégrés ( docs )
  5. SourceFileLoader - un importateur pour un module standard de Python (par défaut a l'extension * .py) ( docs )
  6. ExtensionFileLoader - un fournisseur de modules que bibliothèque partagée ( écrit sur le 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 __name__ == '__main__':
    main()

Utilisation

Pour la CPython3.5 (tronquée)

$ 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 la CPython3.4 (tronquée)

$ 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*******************************)

Si vous avez un vous pouvez de distribution Anaconda python installé, également utiliser

$conda list

en plus des solutions décrites ci-dessus.

gel pip -t-il tous les paquets de Finding mais on peut simplement écrire la commande suivante pour lister tous les chemins où les paquets Python sont.

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

Il y a beaucoup d'idées, d'abord je méditais sur ces deux:

pip

  

contre: pas toujours installé

aide ( 'modules')

  

inconvénients: puissance à la console; avec des modules brisées (voir ubuntu ...) peuvent segfault

J'ai besoin d'une approche facile, en utilisant les bibliothèques de base et compatible avec les anciens 2.x python

Je vois la lumière: listmodules.py

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

Avantages:

  

utilise uniquement diablotin, sys, os, re, le temps

     

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

     

le code source est vraiment compact, de sorte que vous pouvez bricoler facile avec, par exemple pour passer une liste d'exceptions de modules buggy (ne pas essayer de les importer)

Il y a plusieurs façons de la peau d'un chat.

  • La façon la plus simple est d'utiliser la fonction pydoc directement à partir de la coquille avec:
    pydoc modules

  • Mais pour plus d'informations utiliser l'outil appelé jour pépin dire aussi vous les dates d'installation.
    pip install pip-date


Essayez ces

pip list

ou

pip freeze

Je devais trouver la version spécifique des paquets disponibles par défaut dans AWS Lambda. Je l'ai fait avec un mashup d'idées sur cette page. Je 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 je découvre que la bibliothèque boto3 fournie était sortie de ce jour et il était pas ma faute que mon code a échoué. J'ai juste besoin d'ajouter boto3 et botocore à mon projet. Mais sans cela, je l'aurais été cognant ma tête pensante 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 publier officiellement . Au moment de la rédaction:

  
      
  • Système d'exploitation - Linux Amazon
  •   
  • AMI - AMZN-ami-HVM-2017.03.1.20170812-x86_64-gp2
  •   
  • noyau Linux - 4.14.77-70.59.amzn1.x86_64
  •   
  • AWS SDK pour JavaScript - 2.290.0 \
  •   
  • SDK pour python (Boto 3) - 3-1.7.74 botocore-01/10/74
  •   

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

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

Cela vous aidera

terminal ou IPython, du type:

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

À partir du shell

ls site-packages

Si ce n'est pas utile, vous pouvez le faire.

import sys
import os
for p in sys.path:
    print os.listdir( p )

Et voir ce qui produit.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top