我该如何检查代码中是否导入了某个模块?
if not has_imported("somemodule"):
print('you have not imported somemodule')
我希望检查是否已经导入一个模块的原因是因为我有一个模块,我不想导入它,因为有时它会让我的程序出现问题。
我该如何检查代码中是否导入了某个模块?
if not has_imported("somemodule"):
print('you have not imported somemodule')
我希望检查是否已经导入一个模块的原因是因为我有一个模块,我不想导入它,因为有时它会让我的程序出现问题。
import sys
modulename = 'datetime'
if modulename not in sys.modules:
print 'You have not imported the {} module'.format(modulename)
根据文件:
这是一个将模块名称映射到已加载模块的字典。
sys.modules
中),则会加载该模块并将其添加到sys.modules
中。表达式modulename not in sys.modules
测试第1步是否已完成。需要了解使用了哪个确切的import
语句来测试步骤2的结果,因为它们将不同的名称设置为引用不同的对象:
import modulename
设置modulename = sys.modules['modulename']
import packagename.nestedmodule
设置packagename = sys.modules['packagename']
(无论您添加了多少级别)import modulename as altname
设置altname = sys.module['modulename']
import packagename.nestedmodule as altname
设置altname = sys.modules['packagename.nestedmodule']
from somemodule import objectname
设置objectname = sys.modules['somemodule'].objectname
from packagename import nestedmodulename
设置nestedmodulename = sys.modules['packagename.nestedmodulename']
(仅当在此导入之前packagename
命名空间中没有名为nestedmodulename
的对象时,才会添加一个嵌套模块的附加名称到父包命名空间中)from somemodule import objectname as altname
设置altname = sys.modules['somemodule'].objectname
from packagename import nestedmodulename as altname
设置altname = sys.modules['packagename.nestedmodulename']
(仅当在此导入之前packagename
命名空间中没有名为nestedmodulename
的对象时,才会添加一个嵌套模块的附加名称到父包命名空间中)您可以测试导入对象绑定的名称是否存在于给定的命名空间中:
# 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'])
这只告诉你名字是否存在(已绑定),而不是它是否指向该模块的特定对象。如果需要排除自那时以来名称已被设置为完全不同的其他内容,您可以进一步检查该对象或测试其是否与sys.modules
中可用的对象相同。
numpy
包 - 在函数内使用 import sys
来检查是否已导入它是最佳方式吗?我所指的 "最佳方式" 是指性能影响方面,因为每次调用函数时都会调用 import sys
。谢谢。 - Confoundedsys
模块始终处于活动状态。如果你需要知道 sys
是否已导入到当前全局命名空间中,你可以检查名称 sys
是否存在,但我认为这没有任何意义。 - Martijn Pieters在回答sys.modules问题时,我要增加一个注意事项,即在导入时小心重命名模块:
>>> import sys
>>> import datetime as dt
>>> 'dt' in sys.modules
False
>>> 'datetime' in sys.modules
True
使用 sys.modules 来测试一个模块是否已经被导入(这里使用 unicodedata 作为示例):
>>> import sys
>>> 'unicodedata' in sys.modules
False
>>> import unicodedata
>>> 'unicodedata' in sys.modules
True
sys.modules
包含了解释器中任何地方使用的所有模块,因此如果在Python中的任何其他模块中导入,它将显示出来。
dir()
检查名称是否在当前命名空间中定义。
两者的组合比单独使用更安全,并且只要您没有自己定义copy
,就可以正常工作。
if ('copy' in sys.modules) and ('copy' in dir()):
使用:
if "sys" not in dir():
print("sys not imported!")
这在代码开头(顶部)很有效,但应该小心使用,以防另一个名为sys的对象被创建。
as
关键字,那么你选择的名称将会出现在其中;例如 - import numpy as np
- dir()
将包含 np
而不是 numpy
。 - noamgot
raise SystemError()
(或其他您选择的异常)。如果您确实在某个地方导入了它,您的程序将抛出回溯并退出。 - larsks