如何检查我是否在代码中的某个位置导入了模块?
if not has_imported("somemodule"):
print('you have not imported somemodule')
我想检查是否已经导入模块的原因是因为我有一个我不想导入的模块,因为有时会弄乱我的程序。
如何检查我是否在代码中的某个位置导入了模块?
if not has_imported("somemodule"):
print('you have not imported somemodule')
我想检查是否已经导入模块的原因是因为我有一个我不想导入的模块,因为有时会弄乱我的程序。
Answers:
测试sys.modules
字典中的模块名称:
import sys
modulename = 'datetime'
if modulename not in sys.modules:
print 'You have not imported the {} module'.format(modulename)
从文档中:
这是将模块名称映射到已经加载的模块的字典。
请注意,import
语句有两件事:
sys.modules
),则将其加载并添加到sys.modules
。该表达式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']
(仅当此导入之前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
在packagename
命名空间中没有命名对象时,此刻嵌套模块的附加名称才会添加到父包命名空间)您可以测试给定名称空间中是否存在与导入对象绑定的名称:
# 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
如果您需要排除此后名称已完全设置为其他名称,则可以进一步自省该对象或测试其是否与所提供的对象相同。
numpy
包装-import sys
在功能内部使用的最佳方法是检查它是否已导入?所谓“最佳”,是指对性能的影响,import sys
每次调用该函数时都会调用它。谢谢您
import sys
是昂贵的。sys
始终存在,默认情况下已加载。但是对于可选软件包:只需导入package即可。ImportError
如果未安装该软件包,则捕获异常,并设置一个标志,指示导入成功后已安装该软件包。之后,您可以使用该标志来通知您对可选依赖项的使用。
name in 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
可以是任何东西,而不仅仅是模块。
raise SystemError()
(或您选择的其他例外方式)放在您不想导入的模块的顶部。如果你不实际导入它的地方,你的程序将抛出一个回溯并退出。