You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用exec批量运行py文件时如何追踪报错文件及对应行号

多脚本顺序执行的错误定位实现方案

你当前的写法无法定位错误,核心原因是直接传入读取到的纯代码字符串给exec时,Python解释器没有关联代码对应的来源文件信息,报错栈只会标记错误出现在主脚本的exec调用行,无法溯源到子文件。

可直接复用的改造代码

不需要调整你拆分独立文件维护的模式,仅需给代码补充编译绑定文件名、异常捕获逻辑即可,报错时可直接拿到出错文件名+文件内具体行号:

import traceback

calculate = (
    'indicator1.py',
    'indicator2.py',
    'indicator3.py',
    'indicator4.py',
    'indicator5.py',
    'indicator6.py',
    'indicator7.py'
)

for file in calculate:
    print(f"当前执行脚本: {file}")
    try:
        # 以文本模式读取文件内容,避免二进制读取的编码问题
        with open(file, 'r', encoding='utf-8') as f:
            code_content = f.read()
        # 编译代码时绑定来源文件名,报错栈将自动识别子文件行号
        exec(compile(code_content, file, 'exec'))
    except Exception:
        print(f"\n[执行中断] 出错文件: {file}")
        print("详细错误信息:")
        # 打印完整报错栈,包含子文件内的具体报错行、错误类型
        traceback.print_exc()
        # 不需要终止后续脚本执行就删除下面的break
        break

实现说明

  • compile函数的第二个参数用于指定代码的来源文件名,执行时代码的上下文会绑定这个文件名,报错时traceback会像直接运行单个py文件一样,精准标出子文件内的出错行号。
  • 外层异常捕获会在报错第一时间打印明确的出错文件名,不需要翻找长报错栈溯源。
  • 把读取模式从rb改为指定编码的文本模式,可避免中文内容、中文注释触发的编码异常。

可选调整

  • 如果需要跑完所有脚本再统一看错误,删除循环内的break即可,每个出错的脚本都会单独打印对应的错误信息,后续脚本会继续执行。
  • 如果你的脚本使用其他编码,把open里的encoding参数改成对应编码(比如gbk)即可。

内容的提问来源于stack exchange,提问作者TeresaR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 15:12:21