Wie kann ich eine Liste von lokal installierten Python-Modulen bekommen?
Frage
Ich möchte eine Liste von Python-Modulen erhalten, die in meinem Python-Installation (UNIX-Server) sind.
Wie kann man eine Liste von Python-Modulen auf Ihrem Computer installiert werden?
Lösung
Lösung
Verwenden Sie nicht mit pip> 10.0
Mein 50 Cent für eine pip freeze
artige Liste von einem Python-Skript bekommen:
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)
Als (zu lange) Motto:
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']
Anwendungsbereich
gilt diese Lösung auf das System Umfang oder in einen virtuellen Umgebung Umfang und deckt installierten Pakete von setuptools
, pip
und ( Gott bewahre ) easy_install
.
My Use Case
Ich habe das Ergebnis dieses Aufrufs zu meinen Kolben-Server, so dass, wenn ich es mit http://example.com/exampleServer/environment
nennen erhalte ich die Liste der auf dem Server des virtualenv installierten Pakete. Es macht das Debuggen sehr viel einfacher.
Caveats
Ich habe ein seltsames Verhalten dieser Technik bemerkt - wenn das Python-Interpreter in demselben Verzeichnis als setup.py
-Datei aufgerufen wird, ist es nicht das Paket durch setup.py
installiert auflistet
Schritte zum Reproduzieren:
Erstellen einer virtuellen Umgebung$ cd /tmp
$ virtualenv test_env
New python executable in test_env/bin/python
Installing setuptools, pip...done.
$ source test_env/bin/activate
(test_env) $
Klonen einer git Repo mit 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.
Wir haben behave des setup.py
in /tmp/behave
:
(test_env) $ ls /tmp/behave/setup.py
/tmp/behave/setup.py
Installieren Sie das Python-Paket aus dem git Repo
(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
Wenn wir die oben genannte Lösung von /tmp
ausführen
>>> 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'
Wenn wir die oben genannte Lösung von /tmp/behave
ausführen
>>> 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
aus dem zweiten Beispiel fehlt, weil das Arbeitsverzeichnis behave
die setup.py
-Datei enthält.
Ich konnte keinen Hinweis auf dieses Problem in der Dokumentation. Vielleicht werde ich für sie einen Fehler öffnen.
Andere Tipps
help('modules')
in einer Python Shell / prompt.
Nun, diese Methoden, die ich versuchte, mich, und ich bekam genau das, was beworben wurde: Alle Module
.Ach, wirklich interessieren Sie nicht viel über die stdlib, wissen Sie, was Sie mit einem Python-get install.
Wirklich, möchte ich die Sachen, die I installiert.
Was ist eigentlich überraschend, funktionierte gut war:
pip freeze
Welche zurückgegeben:
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
Ich sage „überraschend“, weil das Paket Tool installieren ist die genaue Stelle man erwarten würde, um diese Funktionalität zu finden, wenn auch nicht unter dem Namen ‚einzufrieren‘, aber Python Verpackung so seltsam ist, dass ich baff bin, dass dieses Werkzeug sinnvoll ist. Pip 0.8.2, Python 2.7.
-
In
ipython
können Sie "import
Tab ". eingeben
-
In den Standard-Python-Interpreter können Sie "
help('modules')
". -
An der Befehlszeile können Sie verwenden
pydoc
modules
. -
In einem Skript aufrufen
pkgutil.iter_modules()
.
Seit pip Version 1.3, Sie haben Zugang zu bekommen:
pip list
Welche scheint für „pip freeze“ syntaktischer Zucker zu sein. Es wird alle Module insbesondere für die Installation oder virtualenv, zusammen mit ihren Versionsnummern auflisten. Leider ist es nicht die aktuelle Versionsnummer eines beliebigen Moduls angezeigt werden, auch nicht Ihr Geschirr waschen oder Ihre Schuhe glänzen.
ich diese nur verwenden derzeit verwendeten Module zu sehen:
import sys as s
s.modules.keys()
, die alle Module zeigt auf Python ausgeführt wird.
Für alle Einbaumodule verwenden:
s.modules
Welche ist ein dict alle Module und Import-Objekte enthalten.
Im normal Shell nur verwenden
pydoc modules
Ab pip 10 wird die akzeptierte Antwort nicht mehr. Das Entwicklungsteam hat Zugriff auf die get_installed_distributions
Routine entfernt. Es ist eine alternative Funktion im setuptools
für das gleiche tun. Hier ist eine alternative Version, die funktioniert mit 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)
Bitte lassen Sie mich wissen, ob es will oder nicht in früheren Versionen von pip auch funktionieren.
Wenn wir die installierten Pakete in der Python-Shell zur Liste benötigen, können wir den help
Befehl wie folgt
>>help('modules package')
ich normalerweise verwenden pip list
eine Liste von Paketen zu bekommen (mit Version).
Dies funktioniert in einer virtuellen Umgebung natürlich auch. Um zu zeigen, was nur installiert ist in der virtuellen Umgebung (nicht globale Pakete) verwendet pip list --local
.
Hier Dokumentation alle verfügbaren pip list
Optionen zeigt, mit mehreren guten Beispiele .
Sehr einfache Suche mit 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]
Ich lief in einen benutzerdefinierten installierten Python 2.7 auf OS X. Es benötigte X11 Module zur Liste installiert (beide mit Hilfe und pydoc).
Um in der Lage sein, alle Module aufzulisten, ohne die Installation X11 Ich lief pydoc als http-Server, das heißt:.
pydoc -p 12345
Dann ist es möglich, Safari zu richten an http://localhost:12345/
alle Module zu sehen.
auf Windows, geben Sie diese in cmd
c:\python\libs>python -m pip freeze
Dies wurde von Adam Matan beantworten (die akzeptierten eins):
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))
, die dann druckt eine Tabelle in Form von
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
------------------------------------------- -------------- ------
, die Sie dann leicht erkennen lässt, welche Pakete mit und ohne sudo
installiert.
Ein Hinweis beiseite: Ich habe bemerkt, dass, wenn ich ein Paket einmal über sudo
installieren und einmal ohne, ein Vorrang hat, so dass der andere nicht aufgeführt werden (nur an einer Stelle gezeigt). Ich glaube, dass nur derjenige im lokalen Verzeichnis wird dann aufgeführt. Dies könnte verbessert werden.
Neben pip freeze
Verwendung Ich habe die Installation von Dotter in meinen virtuellen Umgebungen.
- alle verfügbaren Module zu erhalten, führen
sys.modules
- , um alle installiert Module (sprich: von
pip
installiert ist), können Sie beipip.get_installed_distributions()
aussehen
Für den zweiten Zweck, Beispielcode:
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
Diese Lösung ist primär basierend auf Modulen importlib
und pkgutil
und Arbeit mit CPython 3.4 und CPython 3.5, aber keine Unterstützung für die CPython 2 hat.
Erklärung
-
sys.builtin_module_names
- Namen alle eingebauten Modulen (schauen meine Antwort hier ) -
pkgutil.iter_modules()
- liefert eine Information über alle verfügbaren Module -
importlib.util.find_spec()
- liefert eine Information über Modul importieren, falls vorhanden -
BuiltinImporter
- ein Importeur für integrierte Module ( docs ) -
SourceFileLoader
- ein Importeur für einen Standard-Python-Modul (Standard hat Erweiterung * Py) ( docs ) -
ExtensionFileLoader
- ein Importeur für Module wie Shared Library ( geschrieben auf der C oder C ++)
Voll Code
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()
Verwendung
Für die CPython3.5 (abgeschnitten)
$ 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*******************************)
Für die CPython3.4 (abgeschnitten)
$ 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*******************************)
Falls Sie haben ein anaconda Python-Distribution installiert , können Sie auch verwenden
$conda list
zusätzlich zu oben beschriebenen Lösungen.
pip freeze hat es alle Erkenntnis Pakete jedoch kann man einfach den folgenden Befehl schreiben alle Pfade aufzuzählen, in denen Python-Pakete sind.
>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']
Es gibt viele Ideen, zunächst ich auf diesen beiden am Grübeln:
pip
Nachteile: nicht immer installiert
Hilfe ( 'Module')
Nachteile: auf der Konsole; mit gebrochenem Module (siehe ubuntu ...) kann segfault
Ich brauche einen einfachen Ansatz, Basisbibliotheken und kompatibel mit altem Python 2.x mit
Und ich sehe das Licht: listmodules.py
Versteckt in dem Dokumentation Quellverzeichnis in 2.5 ist ein kleines Skript, das alle verfügbaren Module für eine Python-Installation auflistet.
Vorteile:
verwendet nur imp, sys, os, re, Zeit
entwickelt, um auf Python 1.5.2 und neuere ausführen
Der Quellcode ist wirklich kompakt, so dass Sie leicht mit ihm, zum Beispiel Bastelei können eine Ausnahmeliste von Buggy-Module passieren (nicht versuchen, sie zu importieren)
Es gibt viele Wege, die Haut eine Katze.
-
Der einfachste Weg ist es, die
pydoc
Funktion direkt aus der Schale verwenden mit:
pydoc modules
-
Für mehr Informationen das Tool pip-date , die auch sagen, Sie die Installationsdaten.
pip install pip-date
Versuchen Sie diese
pip list
oder
pip freeze
Ich brauchte die spezifische Version von Paketen standardmäßig in AWS Lambda zu finden. Ich tat es mit einem Mashup von Ideen auf dieser Seite. Ich bin es für die Nachwelt zu teilen.
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
],
}
Was ich entdecken, ist, dass die zur Verfügung gestellt boto3 Bibliothek Art und Weise veraltet war und es war nicht meine Schuld, dass mein Code versagt. Ich brauche nur boto3 und botocore zu meinem Projekt hinzuzufügen. Aber ohne diese hätte ich schon meinen Kopf schlug meinen Code zu denken war schlecht.
{
"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
},
...
Was entdeckte ich war auch verschieden von , was sie offiziell veröffentlichen . Zum Zeitpunkt des Schreibens dieser:
- Betriebssystem - Amazon Linux
- AMI - AMZN-ami-HVM-2017.03.1.20170812-x86_64-gp2
- Linux-Kernel - 4.14.77-70.59.amzn1.x86_64
- AWS SDK für JavaScript - 2.290.0 \
- SDK für Python (Boto 3) - 3-1.7.74 botocore-1.10.74
Für alle Fragen, wie pip list
aus einem Python-Programm rufen Sie die folgende verwenden:
import pip
pip.main(['list]) # this will print all the packages
Dies wird helfen,
Im Terminal oder IPython ein:
help('modules')
und
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
Von der Shell
ls site-packages
Wenn das nicht hilfreich ist, können Sie dies tun.
import sys
import os
for p in sys.path:
print os.listdir( p )
Und sehen, was das produziert.