Comment vérifier si j'ai importé un module quelque part dans le code?
if not has_imported("somemodule"):
print('you have not imported somemodule')
La raison pour laquelle je voudrais vérifier si j'ai déjà importé un module est que j'ai un module que je ne veux pas importer parce que parfois cela gâche mon programme.
python
python-import
Yuval
la source
la source
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.Réponses:
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:
Notez qu'une
import
instruction fait deux choses:sys.modules
), alors il est chargé et ajouté àsys.modules
.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 quelleimport
instruction exacte a été utilisée car ils définissent des noms différents pour référencer différents objets:import modulename
ensemblesmodulename = sys.modules['modulename']
import packagename.nestedmodule
ensemblespackagename = sys.modules['packagename']
(quel que soit le nombre de niveaux supplémentaires que vous ajoutez)import modulename as altname
ensemblesaltname = sys.module['modulename']
import packagename.nestedmodule as altname
ensemblesaltname = sys.modules['packagename.nestedmodule']
from somemodule import objectname
ensemblesobjectname = sys.modules['somemodule'].objectname
from packagename import nestedmodulename
ensemblesnestedmodulename = 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
ensemblesaltname = sys.modules['somemodule'].objectname
from packagename import nestedmodulename as altname
ensemblesaltname = 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é:
# 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'])
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.la source
numpy
package - est-ce que l'utilisationimport sys
à l'intérieur de la fonction est la meilleure pour vérifier qu'elle a été importée? Par «meilleur», j'entends en termes d'impact sur les performances, comme on l'import sys
appellera ensuite à chaque appel de la fonction. Merciimport sys
n'est pas du tout cher;sys
existe toujours, il est par défaut déjà chargé. Mais pour un package optionnel: importez simplement le package . Attrapez l'ImportError
exception si le package n'est pas installé et définissez un indicateur indiquant qu'il est installé lorsque l'importation réussit. Après cela, vous pouvez utiliser l'indicateur pour informer votre utilisation de la dépendance facultative.name in sys.modules
test n'est utile que si vous ne souhaitez pas importer .Aux réponses sys.modules acceptées, j'ajouterais une mise en garde pour faire attention au changement de nom des modules lors de l'importation:
>>> import sys >>> import datetime as dt >>> 'dt' in sys.modules False >>> 'datetime' in sys.modules True
la source
utilisez sys.modules pour tester si un module a été importé (j'utilise unicodedata comme exemple):
>>> import sys >>> 'unicodedata' in sys.modules False >>> import unicodedata >>> 'unicodedata' in sys.modules True
la source
sys.modules
contient tous les modules utilisés n'importe où dans l'instance actuelle de l'interpréteur et apparaît ainsi s'il est importé dans un autre module Python.dir()
vérifie si le nom a été défini dans l'espace de noms actuel.La combinaison des 2 est plus sûre que chacune et fonctionne tant que vous n'avez pas défini de
copy
vous - même.if ('copy' in sys.modules) and ('copy' in dir()):
la source
if "sys" not in dir(): print("sys not imported!")
la source
sys
Peut également être n'importe quoi, pas seulement un module.