我在python中有几个模块,它们是动态导入的,并且都具有相同的结构(插件.py, 模型.py, 测试.py, ...). 在管理代码中,我想导入这些子模块,但例如模型.py或者测试.py不是强制性的。(所以我可以有plugin_a.plugin
和{plugin_b.plugin
)。在
我可以通过以下方式检查子模块是否存在
try:
__import__(module_name + ".tests")
except ImportError:
pass
如果找不到module_name+".tests"
,那么这将失败;但是如果tests
-模块本身将尝试导入某个未找到的内容,例如由于键入错误而导致的,则该操作也将失败。
有什么方法可以检查模块是否存在,而不导入它,或者确保ImportError
只由一个特定的导入操作引发?在
从回溯的长度可以看出导入失败的深度。丢失的
.test
模块只有一个回溯帧,直接依赖失败有两个帧,等等Python 2版本,使用^{} 访问回溯:
Python 3版本,其中exceptions have a ^{} attribute :
^{pr2}$演示:
以下来自:How to check if a python module exists without importing it
^{} 函数将返回一个3元素元组(file、pathname、description)或引发ImportError。在
如果模块有问题,它不会引发错误,只有在它不存在的情况下。在
python文档建议您首先查找并导入包,然后在第二个
find_module
中使用它的路径,必要时递归执行。在我觉得这有点乱。在
下面的函数将检查在任何相对导入级别(
module.py
,package.module.py
,package.subpackage.module.py
等)上是否存在给定的模块。在imp.find_module
返回一个打开的文件,可以在imp.load_module
中使用,但这看起来也有点笨拙,所以我关闭了该文件,以便可以在函数外部导入它。在请注意,这并不完美。如果您正在寻找}是一个有效的模块,它也将返回true。在
package.subpackage.module
,但实际上{还请注意,我使用的是}。在
importlib.import_module
,而不是{最后,请注意,^{} 是Python2.7及更高版本
您知道如果模块不存在,导入错误消息会是什么样子,所以只需检查一下:
相关问题 更多 >
编程相关推荐