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

How can I check if a module has been imported?

如何检查我是否在代码中的某处导入了模块?

 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)

来自文档:

This is a dictionary that maps module names to modules which have already been loaded.

请注意 import statement 会做两件事:

  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 nestedmodulename 设置 nestedmodulename = sys.modules['packagename.nestedmodulename'](仅当在此导入之前 packagename 命名空间中没有名为 nestedmodulename 的对象时,才为嵌套模块添加一个额外的名称此时到父包命名空间)
  • from somemodule import objectname as altnamealtname = sys.modules['somemodule'].objectname
  • from packagename import nestedmodulename as altname 设置 altname = 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 中可用的对象相同,如果您需要排除此后名称已完全设置为其他名称的可能性。

使用sys.modules测试模块是否导入(我以unicodedata为例):

>>> import sys
>>> 'unicodedata' in sys.modules
False
>>> import unicodedata
>>> 'unicodedata' in sys.modules
True

使用:

if "sys" not in dir():
  print("sys not imported!")

这在代码的开头(顶部)运行良好,但应谨慎使用,以防创建另一个名为 sys 的对象。

对于已接受的 sys.modules 个答案,我要添加一个注意事项,以注意在导入时重命名模块:

>>> import sys
>>> import datetime as dt
>>> 'dt' in sys.modules
False
>>> 'datetime' in sys.modules
True

sys.modules 包含解释器当前实例中任何地方使用的所有模块,因此如果在任何其他 Python 模块中导入,则会显示。

dir() 检查名称是否在当前命名空间中定义。

两者的组合比单独使用更安全,只要您没有自己定义 copy 就可以工作。

if ('copy' in sys.modules) and ('copy' in dir()):