如何检查是否在代码中的某个位置导入了模块
如果没有导入(“somemodule”):
打印('您尚未导入某个模块')
我想检查我是否已经导入了一个模块,是因为我有一个模块我不想导入,因为有时它会弄乱我的程序
在sys.modules
字典中测试模块名称:
导入系统
modulename=’datetime’
如果sys.modules中没有modulename:
打印“您尚未导入{}模块”。格式(modulename)
从文档中:
这是一个将模块名称映射到已加载模块的字典
请注意,import
语句做两件事:
- 如果以前从未导入过该模块(=不存在于
sys.modules
),则会将其加载并添加到sys.modules
- 在当前命名空间中绑定一个或多个引用模块对象的名称,或绑定到属于模块命名空间成员的对象
表达式modulename不在sys.modules中
测试步骤1是否已发生。测试步骤2的结果需要知道使用了什么确切的import
语句,因为它们设置了不同的名称来引用不同的对象:
import modulename
设置modulename=sys.modules['modulename']
import packagename.nestedmodule
设置packagename=sys.modules['packagename']
(无论添加多少附加级别)import modulename as altname
setaltname=sys.module['modulename']
将packagename.nestedmodule作为altname导入
设置altname=sys.modules['packagename.nestedmodule']
从somemodule导入objectname
设置objectname=sys.modules['somemodule'].objectname
从packagename导入nestedmodulename
设置nestedmodulename=sys.modules['packagename.nestedmodulename']
(只有在导入之前,packagename
命名空间中没有名为nestedmodulename
的对象时,嵌套模块的附加名称才会添加到父包命名空间中)从somemodule将objectname导入为altname
设置altname=sys.modules['somemodule'].objectname
从packagename导入nestedmodulename作为altname
设置altname=sys.modules['packagename.nestedmodulename']
(只有在导入之前,packagename
命名空间中没有名为nestedmodulename
的对象时,嵌套模块的附加名称才会添加到父包命名空间中)
您可以测试导入对象绑定到的名称是否存在于给定命名空间中:
#此名称在当前范围内可见吗:
目录()中的“importedname”
#或者,这是当前模块全局中的名称:
globals()中的“importedname”
#或者,名称是否存在于另一个模块的命名空间中:
全局变量中的“importedname”(sys.modules['somemodule'])
这只会告诉您名称是否存在(已绑定),而不是它是否引用某个特定模块或该模块中的对象。如果需要排除该名称已完全设置为其他名称,则可以进一步内省该对象或测试它是否与sys.modules
中的可用对象相同