Testez le nom du module dans le sys.modules
dictionnaire :
import sys
modulename = 'datetime'
if modulename not in sys.modules:
print 'You have not imported the {} module'.format(modulename)
De la documentation:
Il s'agit d'un dictionnaire qui mappe les noms de modules aux modules qui ont déjà été chargés.
Notez qu'une import
instruction fait deux choses:
- si le module n'a jamais été importé auparavant (== non présent dans
sys.modules
), alors il est chargé et ajouté à sys.modules
.
- Liez un ou plusieurs noms dans l'espace de noms actuel qui référencent l'objet module ou aux objets qui sont membres de l'espace de noms du module.
L'expression modulename not in sys.modules
teste si l'étape 1 a eu lieu. Le test du résultat de l'étape 2 nécessite de savoir quelle import
instruction exacte a été utilisée car ils définissent des noms différents pour référencer différents objets:
import modulename
ensembles modulename = sys.modules['modulename']
import packagename.nestedmodule
ensembles packagename = sys.modules['packagename']
(quel que soit le nombre de niveaux supplémentaires que vous ajoutez)
import modulename as altname
ensembles altname = sys.module['modulename']
import packagename.nestedmodule as altname
ensembles altname = sys.modules['packagename.nestedmodule']
from somemodule import objectname
ensembles objectname = sys.modules['somemodule'].objectname
from packagename import nestedmodulename
ensembles nestedmodulename = sys.modules['packagename.nestedmodulename']
(uniquement lorsqu'il n'y avait aucun objet nommé nestedmodulename
dans l' packagename
espace de noms avant cette importation, un nom supplémentaire pour le module imbriqué est ajouté à l'espace de noms du package parent à ce stade)
from somemodule import objectname as altname
ensembles altname = sys.modules['somemodule'].objectname
from packagename import nestedmodulename as altname
ensembles altname = sys.modules['packagename.nestedmodulename']
(uniquement lorsqu'il n'y avait aucun objet nommé nestedmodulename
dans l' packagename
espace de noms avant cette importation, un nom supplémentaire pour le module imbriqué est ajouté à l'espace de noms du package parent à ce stade)
Vous pouvez tester si le nom auquel l'objet importé était lié existe dans un espace de noms donné:
'importedname' in dir()
'importedname' in globals()
'importedname' in globals(sys.modules['somemodule'])
Cela vous indique seulement que le nom existe (a été lié), pas s'il fait référence à un module ou à un objet spécifique de ce module. Vous pouvez davantage introspecter cet objet ou tester s'il s'agit du même objet que ce qui est disponible dans sys.modules
, si vous devez exclure que le nom a été entièrement défini sur autre chose depuis lors.
raise SystemError()
(ou toute autre exception de votre choix) en haut du module que vous ne souhaitez pas importer. Si vous n'importez réellement quelque part, votre programme va jeter un retraçage et de sortie.