如何检查模块是否已导入?

如何检查是否在代码中的某个位置导入了模块

如果没有导入(“somemodule”):
打印('您尚未导入某个模块')

我想检查我是否已经导入了一个模块,是因为我有一个模块我不想导入,因为有时它会弄乱我的程序

sys.modules字典中测试模块名称:

导入系统
modulename=’datetime’
如果sys.modules中没有modulename:
打印“您尚未导入{}模块”。格式(modulename)

从文档中:

这是一个将模块名称映射到已加载模块的字典

请注意,import语句做两件事:

  1. 如果以前从未导入过该模块(=不存在于sys.modules),则会将其加载并添加到sys.modules
  2. 在当前命名空间中绑定一个或多个引用模块对象的名称,或绑定到属于模块命名空间成员的对象

表达式modulename不在sys.modules中测试步骤1是否已发生。测试步骤2的结果需要知道使用了什么确切的import语句,因为它们设置了不同的名称来引用不同的对象:

  • import modulename设置modulename=sys.modules['modulename']
  • import packagename.nestedmodule设置packagename=sys.modules['packagename'](无论添加多少附加级别)
  • import modulename as altnamesetaltname=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中的可用对象相同

发表评论