Comment puis-je obtenir une liste des modules Python installés localement?
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?
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.
- pour obtenir tous les modules disponibles, exécutez
sys.modules
- pour obtenir tous les installé modules (lire: installé par
pip
), vous pouvez regarderpip.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
-
sys.builtin_module_names
- noms de tous les modules intégrés (regardez ma réponse ) -
pkgutil.iter_modules()
- retourne une information sur tous les modules disponibles -
importlib.util.find_spec()
- retourne une information sur le module d'importation, si elle existe -
BuiltinImporter
- un fournisseur pour les modules intégrés ( docs ) -
SourceFileLoader
- un importateur pour un module standard de Python (par défaut a l'extension * .py) ( docs ) -
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.