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

2022-03-31 00:00:00 python python-import

问题描述

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

 if not has_imported("somemodule"):
     print('you have not imported somemodule')

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


解决方案

测试sys.modules dictionary中的模块名称:

import sys

modulename = 'datetime'
if modulename not in sys.modules:
    print 'You have not imported the {} module'.format(modulename)

摘自文档:

这是将模块名称映射到已加载模块的词典。

请注意,import statement执行两项操作:

  1. 如果以前从未导入过该模块(==不在sys.modules中),则会加载该模块并将其添加到sys.modules
  2. 将当前命名空间中引用模块对象的一个或多个名称绑定到模块命名空间成员的对象。
modulename not in sys.modules表达式测试步骤1是否已发生。测试步骤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 nestedmodulenamenestedmodulename = sys.modules['packagename.nestedmodulename'](仅当此导入之前的packagename命名空间中没有名为nestedmodulename的对象时,嵌套模块的附加名称此时会添加到父包命名空间中)
  • from somemodule import objectname as altname集合altname = sys.modules['somemodule'].objectname
  • from packagename import nestedmodulename as altnamealtname = 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中提供的对象相同。

相关文章