Testen Sie den Modulnamen im sys.modulesWörterbuch :
import sys
modulename = 'datetime'
if modulename not in sys.modules:
print 'You have not imported the {} module'.format(modulename)
Aus der Dokumentation:
Dies ist ein Wörterbuch, das Modulnamen bereits geladenen Modulen zuordnet.
Beachten Sie, dass eine importAnweisung zwei Dinge tut:
- Wenn das Modul noch nie importiert wurde (== nicht vorhanden in
sys.modules), wird es geladen und hinzugefügt sys.modules.
- Binden Sie einen oder mehrere Namen im aktuellen Namespace, die auf das Modulobjekt verweisen, oder an Objekte, die Mitglieder des Modul-Namespace sind.
Der Ausdruck modulename not in sys.modulestestet, ob Schritt 1 stattgefunden hat. Um das Ergebnis von Schritt 2 zu testen, muss bekannt sein, welche genaue importAnweisung verwendet wurde, da unterschiedliche Namen festgelegt wurden, um auf verschiedene Objekte zu verweisen:
import modulename setzt modulename = sys.modules['modulename']
import packagename.nestedmoduleSätze packagename = sys.modules['packagename'](egal wie viele zusätzliche Ebenen Sie hinzufügen)
import modulename as altname setzt altname = sys.module['modulename']
import packagename.nestedmodule as altname setzt altname = sys.modules['packagename.nestedmodule']
from somemodule import objectname setzt objectname = sys.modules['somemodule'].objectname
from packagename import nestedmodulenameSets nestedmodulename = sys.modules['packagename.nestedmodulename'](nur wenn vor diesem Import kein Objekt nestedmodulenameim packagenameNamespace 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 setzt altname = sys.modules['somemodule'].objectname
from packagename import nestedmodulename as altnameSets altname = sys.modules['packagename.nestedmodulename'](nur wenn vor diesem Import kein Objekt nestedmodulenameim packagenameNamespace 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:
# is this name visible in the current scope:
'importedname' in dir()
# or, is this a name in the globals of the current module:
'importedname' in globals()
# or, does the name exist in the namespace of another module:
'importedname' in globals(sys.modules['somemodule'])
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.
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.