gpt4 book ai didi

python - 由于在 python 中找不到模块或模块本身错误导入,区分 ImportError?

转载 作者:太空宇宙 更新时间:2023-11-03 13:20:05 25 4
gpt4 key购买 nike

我在 python 中有几个模块,它们是动态导入的,并且都具有相同的结构(plugin.py、models.py、tests.py,...)。在管理代码中,我想导入那些子模块,但例如 models.py 或 tests.py 不是强制性的。 (所以我可以有 plugin_a.pluginplugin_a.tests 但只有 plugin_b.plugin)。

我可以检查子模块是否存在

try:
__import__(module_name + ".tests")
except ImportError:
pass

如果 module_name+".tests" 没有找到,那会失败,但如果 tests 模块本身尝试导入一些东西,它也会失败,这是未找到,例如因为打字错误。有没有什么方法可以检查模块是否存在,而不导入它或确保 ImportError 仅由一个特定的导入操作引发?

最佳答案

您可以从回溯的长度中看出导入失败的深度有多少。缺少的 .test 模块只有一帧的回溯,直接依赖失败有两帧,等等。

Python 2 版本,使用 sys.exc_info()访问回溯:

import sys


try:
__import__(module_name + ".tests")
except ImportError:
if sys.exc_info()[-1].tb_next is not None:
print "Dependency import failed"
else:
print "No module {}.tests".format(module_name)

Python 3 版本,其中 exceptions have a __traceback__ attribute :

try:
__import__(module_name + ".tests")
except ImportError as exc:
if exc.__traceback__.tb_next is not None:
print("Dependency import failed")
else:
print("No module {}.tests".format(module_name))

演示:

>>> import sys
>>> def direct_import_failure(name):
... try:
... __import__(name)
... except ImportError:
... return sys.exc_info()[-1].tb_next is None
...
>>> with open('foo.py', 'w') as foo:
... foo.write("""\
... import bar
... """)
...
>>> direct_import_failure('bar')
True
>>> direct_import_failure('foo')
False

关于python - 由于在 python 中找不到模块或模块本身错误导入,区分 ImportError?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16625906/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com