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

于瓦尔:

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

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

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

马丁·彼得斯(Martijn Pieters):

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

import sys

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

从文档中:

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

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

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

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

  • import modulenamemodulename = sys.modules['modulename']
  • import packagename.nestedmodulepackagename = sys.modules['packagename'](无论您添加多少个附加级别)
  • import modulename as altnamealtname = sys.module['modulename']
  • import packagename.nestedmodule as altnamealtname = sys.modules['packagename.nestedmodule']
  • from somemodule import objectnameobjectname = sys.modules['somemodule'].objectname
  • from packagename import nestedmodulenamenestedmodulename = sys.modules['packagename.nestedmodulename'](仅当此导入之前nestedmodulenamepackagename名称空间中没有命名对象时,嵌套模块的附加名称才会在此时添加到父包名称空间)
  • from somemodule import objectname as altnamealtname = sys.modules['somemodule'].objectname
  • from packagename import nestedmodulename as altnamealtname = sys.modules['packagename.nestedmodulename'](仅当此导入之前nestedmodulenamepackagename名称空间中没有命名对象时,嵌套模块的附加名称才会在此时添加到父包名称空间)

您可以测试给定名称空间中是否存在导入对象绑定到的名称:

# 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如果您需要排除此后名称已完全设置为其他名称,则可以进一步自省该对象或测试该对象是否与所提供的对象相同

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章