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

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

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

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

120930 次浏览

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

使用 < a href = “ https://docs.python.org/3/library/sys.html测试是否导入了模块(我使用 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.module 答案,我要添加一个警告,注意在导入时重命名模块:

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

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

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

两者的结合比每个单独的更安全,并且只要你自己没有定义一个 copy就可以工作。

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