Wie überprüfe ich, ob ich irgendwo im Code ein Modul importiert habe?
if not has_imported("somemodule"):
print('you have not imported somemodule')
Der Grund, warum ich überprüfen möchte, ob ich bereits ein Modul importiert habe, ist, dass ich ein Modul habe, das ich nicht importieren möchte, weil es manchmal mein Programm durcheinander bringt.
python
python-import
Yuval
quelle
quelle
raise SystemError()
(oder eine andere Ausnahme Ihrer Wahl) oben in das Modul ein, das Sie nicht importieren möchten. Wenn Sie es tatsächlich irgendwo importieren, wird Ihr Programm einen Traceback auslösen und beenden.Antworten:
Testen Sie den Modulnamen im
sys.modules
Wörterbuch :Aus der Dokumentation:
Beachten Sie, dass eine
import
Anweisung zwei Dinge tut:sys.modules
), wird es geladen und hinzugefügtsys.modules
.Der Ausdruck
modulename not in sys.modules
testet, ob Schritt 1 stattgefunden hat. Um das Ergebnis von Schritt 2 zu testen, muss bekannt sein, welche genaueimport
Anweisung verwendet wurde, da unterschiedliche Namen festgelegt wurden, um auf verschiedene Objekte zu verweisen:import modulename
setztmodulename = sys.modules['modulename']
import packagename.nestedmodule
Sätzepackagename = sys.modules['packagename']
(egal wie viele zusätzliche Ebenen Sie hinzufügen)import modulename as altname
setztaltname = sys.module['modulename']
import packagename.nestedmodule as altname
setztaltname = sys.modules['packagename.nestedmodule']
from somemodule import objectname
setztobjectname = sys.modules['somemodule'].objectname
from packagename import nestedmodulename
Setsnestedmodulename = sys.modules['packagename.nestedmodulename']
(nur wenn vor diesem Import kein Objektnestedmodulename
impackagename
Namespace benannt wurde, wird zu diesem Zeitpunkt ein zusätzlicher Name für das verschachtelte Modul zum Namespace des übergeordneten Pakets hinzugefügt)from somemodule import objectname as altname
setztaltname = sys.modules['somemodule'].objectname
from packagename import nestedmodulename as altname
Setsaltname = sys.modules['packagename.nestedmodulename']
(nur wenn vor diesem Import kein Objektnestedmodulename
impackagename
Namespace benannt wurde, wird zu diesem Zeitpunkt ein zusätzlicher Name für das verschachtelte Modul zum Namespace des übergeordneten Pakets hinzugefügt)Sie können testen, ob der Name, an den das importierte Objekt gebunden wurde, in einem bestimmten Namespace vorhanden ist:
Dies sagt Ihnen nur, dass der Name existiert (gebunden wurde), nicht, wenn er sich auf ein bestimmtes Modul oder Objekt aus diesem Modul bezieht. Sie können dieses Objekt weiter untersuchen oder testen, ob es dasselbe Objekt ist wie das, in dem es verfügbar ist
sys.modules
, wenn Sie ausschließen müssen, dass der Name seitdem vollständig auf etwas anderes festgelegt wurde.quelle
numpy
Paket erforderlich. Ist die Verwendungimport sys
innerhalb der Funktion am besten geeignet, um zu überprüfen, ob sie importiert wurde? Mit "am besten" meine ich die Auswirkungen auf die Leistungimport sys
, die dann bei jedem Aufruf der Funktion aufgerufen werden. Vielen Dankimport sys
das in irgendeiner Weise teuer wäre;sys
existiert immer, es ist standardmäßig schon geladen. Aber für ein optionales Paket: Importieren Sie einfach das Paket . Fangen Sie dieImportError
Ausnahme ab, wenn das Paket nicht installiert ist, und setzen Sie ein Flag, das angibt, dass es installiert ist, wenn der Import erfolgreich ist. Danach können Sie das Flag verwenden, um Ihre Verwendung über die optionale Abhängigkeit zu informieren.name in sys.modules
Test ist nur nützlich, wenn Sie nicht importieren möchten .Zu den akzeptierten Antworten von sys.modules möchte ich eine Einschränkung hinzufügen, um beim Umbenennen von Modulen beim Import vorsichtig zu sein:
quelle
Verwenden Sie sys.modules, um zu testen, ob ein Modul importiert wurde (ich verwende Unicodedata als Beispiel):
quelle
sys.modules
Enthält alle Module, die an einer beliebigen Stelle in der aktuellen Instanz des Interpreters verwendet werden, und wird angezeigt, wenn sie in ein anderes Python-Modul importiert werden.dir()
prüft, ob der Name im aktuellen Namespace definiert wurde.Die Kombination der beiden ist sicherer als jede einzelne und funktioniert so lange, wie Sie selbst keine definiert haben
copy
.quelle
quelle
sys
kann alles, nicht nur ein Modul sein.