Wie erhalte ich eine Liste der auf meinem Computer installierten Python-Module?
Antworten
Zu viele Anzeigen?- um alle verfügbaren Module zu erhalten, führen Sie
sys.modules
- um alle installiert Module (gelesen: installiert von
pip
), können Sie nachsehenpip.get_installed_distributions()
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
Ich musste die spezifische Version der standardmäßig in AWS Lambda verfügbaren Pakete finden. Ich tat dies mit einem Mashup von Ideen von dieser Seite. Ich teile es für die Nachwelt.
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
],
}
Ich entdeckte, dass die mitgelieferte boto3-Bibliothek veraltet war und es nicht meine Schuld war, dass mein Code nicht funktionierte. Ich musste nur boto3 und botocore zu meinem Projekt hinzufügen. Aber ohne dies hätte ich mir den Kopf darüber zerbrochen, dass mein Code schlecht ist.
{
"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 ich entdeckte, war auch anders als was sie offiziell veröffentlichen . Zum Zeitpunkt der Erstellung dieses Artikels:
- 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
Es gibt viele Ideen, zunächst denke ich über diese beiden nach:
pip
Nachteile: nicht immer installiert
Hilfe('Module')
Nachteile: Ausgabe auf der Konsole; bei defekten Modulen (siehe Ubuntu...) kann es zu Fehlern kommen
Ich brauche einen einfachen Ansatz, mit grundlegenden Bibliotheken und kompatibel mit alten Python 2.x
Und ich sehe das Licht: listmodules.py
Im Quellverzeichnis der Dokumentation in 2.5 ist ein kleines Skript versteckt, das alle verfügbaren Module für eine Python-Installation auflistet.
Vorteile:
verwendet nur imp, sys, os, re, zeit
entwickelt für Python 1.5.2 und neuere Versionen
der Quellcode ist sehr kompakt, so dass man leicht daran herumbasteln kann, z.B. um eine Ausnahmeliste von fehlerhaften Modulen zu übergeben (versuchen Sie nicht, sie zu importieren)