如何检查python模块是否已导入? [英] How to check if a python module has been imported?

查看:324
本文介绍了如何检查python模块是否已导入?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

How do I check if I imported a module somewhere in the code?

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

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

The reason that I would like to check if I already imported a module is because I have a module that I don't want to import because sometimes it messes up my program.

推荐答案

测试 sys.modules 字典:

Test for the module name in the 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 语句 做了两件事:

Note that an import statement does two things:

  1. 如果之前从未导入过该模块(== 不存在于 sys.modules 中),则将其加载并添加到 sys.modules.
  2. 将当前命名空间中的 1 个或多个名称绑定到引用模块对象或作为模块命名空间成员的对象.
  1. if the module has never been imported before (== not present in sys.modules), then it is loaded and added to sys.modules.
  2. Bind 1 or more names in the current namespace that reference the module object or to objects that are members of the module namespace.

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

The expression modulename not in sys.modules tests if step 1 has taken place. Testing for the result of step 2 requires knowing what exact import statement was used as they set different names to reference different objects:

  • 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 set objectname = sys.modules['somemodule'].objectname
  • from packagename import nestedmodulename sets nestedmodulename = sys.modules['packagename.nestedmodulename'](仅当没有名为nestedmodulename的对象时在此导入之前的 packagename 命名空间中,此时将嵌套模块的附加名称添加到父包命名空间)
  • from somemodule import objectname as altname 设置 altname = sys.modules['somemodule'].objectname
  • from packagename import nestedmodulename as altname 设置 altname = sys.modules['packagename.nestedmodulename'] (仅当没有名为 nestedmodulename 的对象时)code> 在此导入之前的 packagename 命名空间中,此时将嵌套模块的附加名称添加到父包命名空间)
  • import modulename sets modulename = sys.modules['modulename']
  • import packagename.nestedmodule sets packagename = sys.modules['packagename'] (no matter how many addional levels you add)
  • import modulename as altname sets altname = sys.module['modulename']
  • import packagename.nestedmodule as altname sets altname = sys.modules['packagename.nestedmodule']
  • from somemodule import objectname sets objectname = sys.modules['somemodule'].objectname
  • from packagename import nestedmodulename sets nestedmodulename = sys.modules['packagename.nestedmodulename'] (only when there was no object named nestedmodulename in the packagename namespace before this import, an additional name for the nested module is added to the parent package namespace at this point)
  • from somemodule import objectname as altname sets altname = sys.modules['somemodule'].objectname
  • from packagename import nestedmodulename as altname sets altname = sys.modules['packagename.nestedmodulename'] (only when there was no object named nestedmodulename in the packagename namespace before this import, an additional name for the nested module is added to the parent package namespace at this point)

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

You can test if the name to which the imported object was bound exists in a given namespace:

# 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 中可用的对象相同,如果您需要排除此名称从那时起已完全设置为其他内容.

This only tells you of the name exists (has been bound), not if it refers to a specific module or object from that module. You could further introspect that object or test if it’s the same object as what’s available in sys.modules, if you need to rule out that the name has been set to something else entirely since then.

这篇关于如何检查python模块是否已导入?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆