【问题标题】:Catch the traceback from the imported module only仅从导入的模块中捕获回溯
【发布时间】:2026-02-15 14:30:01
【问题描述】:

我有一个包可以执行其他模块并对它们执行一些方法。我需要做的一件事是模块执行的完整回溯,如果它遇到错误。目前我正在执行模块并像这样获取回溯:

try:
    module = importlib.import_module(os.path.splitext(args.file)[0])
except Exception as e:
    traceback.print_tb(e.__traceback__)

例如,如果我有这个模块:

# example.py
print({}[1])

如果我单独运行代码时得到的引用是这样的:

Traceback (most recent call last):
  File "example.py", line 2, in <module>
    print(my_dict[1])
KeyError: 1

这是预期的输出,但我的代码提供了额外的不需要的信息:

  File "/home/username/Desktop/Coding/Python/packagename/packagename/__main__.py", line 15, in <module>
    module = importlib.import_module(os.path.splitext(args.file)[0])
  File "/usr/lib/python3.8/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 783, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/home/username/Desktop/Coding/Python/packagename/example.py", line 2, in <module>
    print(my_dict[1])

我怎样才能只获得预期的输出,而不是完整的回溯?


编辑

所以,我找到了另一个解决方案,但我必须执行两次:

try:
    subprocess.call(f"python3 {args.file}", shell=True)
    importlib.import_module(os.path.splitext(args.file)[0])
except Exception as e:
    # Function that does something with e
    foo(e)

这不是很好的代码,所以我想知道如何才能使它变得更好?谢谢!

【问题讨论】:

    标签: python-3.x traceback python-importlib


    【解决方案1】:

    traceback 总是向上到你捕获它的地方,所以如果你想排除在导入 else 期间完成的步骤,你需要更早地捕获它。你能在你导入的脚本中捕捉到它吗?然后,例如,您可以使用原始异常作为参数引发另一个异常,以将原始异常下移一级。

    #the imported file
    try:
        print({}[1])
    except Exception as e:
        raise Exception(e)
    
    
    #the importing file
    try:
        module = importlib.import_module(os.path.splitext(args.file)[0])
    except Exception as e:
        traceback.print_tb(e.args[0].__traceback__)
    

    【讨论】: