如何检查我是否在代码中的某个位置导入了模块?
if not has_imported("somemodule"):
print('you have not imported somemodule')
我想检查是否已经导入了模块的原因是因为我有一个不想导入的模块,因为有时它会弄乱我的程序。
测试模块名称sys.modules字典:
import sys
modulename = 'datetime'
if modulename not in sys.modules:
print 'You have not imported the {} module'.format(modulename)
从文档中:
这是一个字典,将模块名称映射到已加载的模块。
请注意,import陈述做了两件事:
- 如果该模块以前从未导入过(==不存在于
sys.modules
),然后将其加载并添加到sys.modules
.
- 在当前命名空间中绑定 1 个或多个引用模块对象或属于模块命名空间成员的对象的名称。
表达方式modulename not in sys.modules
测试步骤 1 是否已发生。测试步骤 2 的结果需要知道确切的内容import
使用声明是因为它们设置不同的名称来引用不同的对象:
-
import modulename
sets modulename = sys.modules['modulename']
-
import packagename.nestedmodule
sets packagename = sys.modules['packagename']
(无论您添加多少额外级别)
-
import modulename as altname
sets altname = sys.module['modulename']
-
import packagename.nestedmodule as altname
sets altname = sys.modules['packagename.nestedmodule']
-
from somemodule import objectname
sets objectname = sys.modules['somemodule'].objectname
-
from packagename import nestedmodulename
sets nestedmodulename = sys.modules['packagename.nestedmodulename']
(仅当没有名为的对象时nestedmodulename
in the packagename
在此导入之前的命名空间,此时嵌套模块的附加名称将添加到父包命名空间中)
-
from somemodule import objectname as altname
sets altname = sys.modules['somemodule'].objectname
-
from packagename import nestedmodulename as altname
sets altname = sys.modules['packagename.nestedmodulename']
(仅当没有名为的对象时nestedmodulename
in the packagename
在此导入之前的命名空间,此时嵌套模块的附加名称将添加到父包命名空间中)
您可以测试导入对象绑定的名称是否存在于给定命名空间中:
# 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
,如果您需要排除从那时起该名称已被完全设置为其他名称的情况。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)