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.
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.
Dans ipython
vous pouvez taper "import
Tab".
Dans l'interpréteur Python standard, vous pouvez taper "help('modules')
".
Sur la ligne de commande, vous pouvez utiliser pydoc
modules
.
Dans un script, appelez pkgutil.iter_modules()
.
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.
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.
Dans Shell normal, il suffit d'utiliser
pydoc modules
À 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.
Si nous devons répertorier les packages installés dans le shell Python, nous pouvons utiliser la commande help
comme suit:
>>help('modules package')
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.
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]
sur windows, entrez ceci en cmd
c:\python\libs>python -m pip freeze
J'utilise normalement pip list
pour obtenir une liste de paquets (avec la version).
Cela fonctionne également dans un environnement virtuel.
En plus d'utiliser pip freeze
, j'ai installé yolk dans mes environnements virtuels.
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
sys.builtin_module_names
- nomme tous les modules intégrés (regardez ma réponse ici )pkgutil.iter_modules()
- renvoie une information sur tous les modules disponiblesimportlib.util.find_spec()
- renvoie une information sur l'importation du module, s'il existeBuiltinImporter
- un importateur de modules intégrés ( docs )SourceFileLoader
- un importateur pour un module Python standard (par défaut, l'extension * .py) ( docs )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*******************************)
sys.modules
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
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']
Essayez ces
pip list
ou
pip freeze
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é.
Si vous avez une distribution anaconda python installée, vous pouvez également utiliser
$conda list
en plus des solutions décrites ci-dessus.
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)
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
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
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
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