Ich muss wissen, ob ein Python-Modul vorhanden ist, ohne es zu importieren.
Importieren von etwas, das möglicherweise nicht vorhanden ist (nicht das, was ich möchte):
try:
import eggs
except ImportError:
pass
python
python-import
Yarbelk
quelle
quelle
Antworten:
Python2
Um zu überprüfen, ob der Import etwas in Python2 finden kann, verwenden Sie
imp
Um gepunktete Importe zu finden, müssen Sie mehr tun:
Sie können auch verwenden
pkgutil.find_loader
(mehr oder weniger das gleiche wie der Python3-TeilPython3
Python3 ≤ 3.3
Sie sollten verwenden
importlib
, wie ich dies tat, war:Meine Erwartung ist, wenn Sie einen Lader dafür finden können, dann existiert er. Sie können auch etwas schlauer sein, z. B. herausfinden, welche Lader Sie akzeptieren. Beispielsweise:
Python3 ≥ 3.4
In Python3.4 wurden
importlib.find_loader
Python-Dokumente zugunsten von abgelehntimportlib.util.find_spec
. Die empfohlene Methode ist dieimportlib.util.find_spec
. Es gibt andere wieimportlib.machinery.FileFinder
, was nützlich ist, wenn Sie nach einer bestimmten Datei zum Laden suchen. Es liegt außerhalb des Rahmens, herauszufinden, wie man sie verwendet.Dies funktioniert auch bei relativen Importen, Sie müssen jedoch das Startpaket angeben, damit Sie auch Folgendes tun können:
Ich bin mir zwar sicher, dass es einen Grund dafür gibt - aber ich bin mir nicht sicher, was es sein würde.
WARNUNG
Beim Versuch, ein Submodul zu finden, wird das übergeordnete Modul importiert (für alle oben genannten Methoden)!
Kommentare sind willkommen, um dies zu umgehen
Danksagung
find_loader
quelle
eggs.ham.spam
.spam
in dieeggs.ham
Sie verwenden würdenimp.find_module('spam', ['eggs', 'ham'])
imp
ist veraltet zugunsten vonimportlib
in Python 3.pkgutil.find_loader("my.package.module")
Gibt einen Loader zurück, wenn das Paket / Modul vorhanden ist undNone
wenn nicht. Bitte aktualisieren Sie Ihre Antwort für Python 2, da mich das Maskieren des ImportError gestern verrückt gemacht hat xPNach der Verwendung von yarbelks Antwort habe ich dies gemacht, damit ich nicht importieren muss
ìmp
.Nützlich
settings.py
zum Beispiel bei Django .quelle
Python 3> = 3.6: ModuleNotFoundError
Das
ModuleNotFoundError
wurde in Python 3.6 eingeführt und kann für diesen Zweck verwendet werdenDer Fehler wird ausgelöst, wenn ein Modul oder eines seiner übergeordneten Elemente nicht gefunden werden kann. So
würde eine Nachricht drucken, die aussieht,
No module named 'eggs'
wenn daseggs
Modul nicht gefunden werden kann; würde aber so etwas drucken wieNo module named 'eggs.sub'
wenn nur dassub
modul nicht gefunden werden könnte aber daseggs
Paket gefunden werden könnte.Weitere Informationen finden Sie in der Dokumentation des Importsystems
ModuleNotFoundError
quelle
Python 2, ohne sich auf ImportError zu verlassen
Bis die aktuelle Antwort aktualisiert ist, ist hier der Weg für Python 2
Warum noch eine Antwort?
Viele Antworten nutzen das Fangen eines
ImportError
. Das Problem dabei ist, dass wir nicht wissen können, was das wirftImportError
.Wenn Sie Ihr vorhandenes Modul importieren und es zufällig ein
ImportError
Modul in Ihrem Modul gibt (z. B. Tippfehler in Zeile 1), führt dies dazu, dass Ihr Modul nicht vorhanden ist. Sie benötigen eine Menge Backtracking, um herauszufinden, dass Ihr Modul vorhanden ist und dasImportError
abgefangen wird und die Dinge lautlos versagen.quelle
ImportError
- bitte bearbeiten Sie, wenn es Ihnen unklar war.go_as 'Antwort als Einzeiler
quelle
Ich bin auf diese Frage gestoßen, als ich nach einer Möglichkeit gesucht habe, zu überprüfen, ob ein Modul über die Befehlszeile geladen wurde und möchte meine Gedanken für diejenigen teilen, die nach mir kommen und nach demselben suchen:
Linux / UNIX-Skriptdateimethode : Erstellen Sie eine Datei
module_help.py
:Stellen Sie dann sicher, dass es ausführbar ist:
chmod u+x module_help.py
Und nenne es mit einem
pipe
zugrep
:Interaktive Methode : in der Konsole laden
python
Wenn gefunden, beenden Sie das Lesen durch Eingabe von.
q
Um die interaktive Python-Sitzung zu beenden, drücken Sie Ctrl+D
Windows-Skriptdateimethode auch Linux / UNIX-kompatibel und insgesamt besser :
Rufen Sie es vom Befehl aus wie folgt auf:
Würde ausgeben:
und Sie müssten drücken
q
, um den interaktiven Modus zu verlassen.Verwenden Sie es unbekanntes Modul:
Würde ausgeben:
und verlassen.
quelle
Verwenden Sie eine der Funktionen von pkgutil , zum Beispiel:
quelle
Eine einfachere if-Anweisung von AskUbuntu: Wie überprüfe ich, ob ein Modul in Python installiert ist?
quelle
Sie könnten einfach ein kleines Skript schreiben, das versucht, alle Module zu importieren und Ihnen mitzuteilen, welche fehlerhaft sind und welche funktionieren:
Ausgabe:
Ein Wort der Warnung, dies wird versuchen, alles zu importieren , so dass Sie Dinge wie sehen werden,
PyYAML failed with error code: No module named pyyaml
weil der tatsächliche Importname nur yaml ist. Solange Sie Ihre Importe kennen, sollte dies den Trick für Sie tun.quelle
Ich habe diese Hilfsfunktion geschrieben:
quelle
Sie können auch
importlib
direkt verwendenquelle
Es gibt keine Möglichkeit, zuverlässig zu überprüfen, ob "gepunktetes Modul" importierbar ist, ohne das übergeordnete Paket zu importieren. Vor diesem Hintergrund gibt es viele Lösungen für das Problem "Überprüfen, ob ein Python-Modul vorhanden ist".
Die folgende Lösung behebt das Problem, dass das importierte Modul ImportError auslösen kann, selbst wenn es existiert. Wir wollen diese Situation von einer Situation unterscheiden, in der kein Modul existiert.
Python 2 :
Python 3 :
quelle
in django.utils.module_loading.module_has_submodule
quelle