技术教程 · 阅读约 7 分钟

30 行 Python 让 AI 自动修复 Codex Bug,我再也不用盯着报错信息发呆了

30 行 Python 让 AI 自动修复 Codex Bug,我再也不用盯着报错信息发呆了

你有没有遇到过这种情况:让 Codex 写了一段代码,跑起来报错,把错误贴给它让它修,修完又报新的错,来回几轮之后你已经不知道到底是代码的问题还是自己的问题。

V2EX 上有人忍无可忍,写了个自动修 Codex bug 的小工具。思路其实很简单:把「运行 → 报错 → 让 AI 修」这个循环自动化,人只管喝茶。

这篇文章就照着这个思路,从零写一个可以直接用的版本,完整代码不超过 80 行。


核心思路

整个流程就三步,用一个 while 循环串起来:


运行代码 → 捕获 stderr → 把错误 + 代码发给 AI → 拿回修复后的代码 → 写回文件 → 再跑一次

终止条件:运行成功(returncode == 0),或者重试次数超过上限(防止死循环)。

AI 拿到的上下文是:当前完整代码 + 报错信息。这比单独贴错误信息效果好得多,模型能看到是哪一行出的问题,修复成功率明显更高。


完整代码


import subprocess

import sys

import os

from openai import OpenAI



# 用无量 API,国内直连,比官方便宜 60%+

client = OpenAI(

    api_key=os.environ.get("WULIANG_API_KEY"),

    base_url="https://api2everything.xyz/v1"

)



MODEL = "gpt-4.1"       # 换成 claude-sonnet-4-5 也行

MAX_RETRIES = 5

TARGET_FILE = sys.argv[1] if len(sys.argv) > 1 else "target.py"





def run_script(filepath: str) -> tuple[int, str]:

    """运行脚本,返回 (returncode, stderr)"""

    result = subprocess.run(

        [sys.executable, filepath],

        capture_output=True,

        text=True,

        timeout=30

    )

    return result.returncode, result.stderr + result.stdout





def ask_ai_to_fix(code: str, error: str) -> str:

    """把代码和报错发给 AI,拿回修复后的完整代码"""

    prompt = f"""下面是一段 Python 代码,运行后报错了。

请直接返回修复后的完整代码,不要加任何解释,不要用 markdown 代码块包裹。



=== 当前代码 ===

{code}



=== 报错信息 ===

{error}



修复后的完整代码:"""



    response = client.chat.completions.create(

        model=MODEL,

        messages=[{"role": "user", "content": prompt}],

        temperature=0.2   # 修 bug 场景要稳,temperature 调低

    )

    return response.choices[0].message.content.strip()





def auto_fix_loop(filepath: str):

    print(f"🔍 目标文件: {filepath}")



    for attempt in range(1, MAX_RETRIES + 1):

        returncode, output = run_script(filepath)



        if returncode == 0:

            print(f"✅ 第 {attempt} 次运行成功!")

            return



        print(f"❌ 第 {attempt} 次失败,正在让 AI 修复...")

        print(f"   错误摘要: {output[:200]}")



        with open(filepath, "r", encoding="utf-8") as f:

            current_code = f.read()



        fixed_code = ask_ai_to_fix(current_code, output)



        # 写回文件前先备份

        backup_path = f"{filepath}.bak{attempt}"

        with open(backup_path, "w", encoding="utf-8") as f:

            f.write(current_code)



        with open(filepath, "w", encoding="utf-8") as f:

            f.write(fixed_code)



        print(f"   已备份原文件到 {backup_path},写入修复版本")



    print(f"⚠️  已重试 {MAX_RETRIES} 次,仍未成功,请人工介入")





if __name__ == "__main__":

    auto_fix_loop(TARGET_FILE)


怎么用

1. 安装依赖


pip install openai

2. 设置 API Key

api2everything.xyz 注册,新用户送 ¥1 余额直接能用,拿到 key 之后:


export WULIANG_API_KEY="sk-xxxx"

3. 跑起来

假设你有一个有 bug 的脚本 messy.py


python auto_fix.py messy.py

输出大概长这样:


🔍 目标文件: messy.py

❌ 第 1 次失败,正在让 AI 修复...

   错误摘要: NameError: name 'pd' is not defined ...

   已备份原文件到 messy.py.bak1,写入修复版本

✅ 第 2 次运行成功!


几个值得注意的细节

temperature 设低一点。修 bug 不是创作,你要的是稳定可预期的输出,0.1 ~ 0.2 就够了。调高了 AI 可能给你"创意性"地重写整个逻辑。

备份很重要。AI 修复有时候会过度修改,把原本没问题的逻辑也动了。备份文件让你随时可以回退,.bak1 .bak2 按轮次存,出了问题一眼看清每次改了什么。

上下文给完整的,别只贴 stderr。stdout 里可能有你自己加的 print 调试信息,这些上下文对 AI 判断问题根因很有帮助。

超时保护不能省。如果你的脚本里有死循环,没有 timeout=30 这个工具就会一直卡在那里。


升级方向

如果觉得这个版本够用了可以就这样,如果想继续玩:

  • 换模型:把 MODEL 改成 claude-sonnet-4-5,Claude 在理解代码逻辑方面有时候比 GPT 更准,而且无量 API 上两个都能用,一行切换
  • 加 diff 输出:每次修复后用 difflib 打印改了哪里,一目了然
  • 支持多文件项目:把整个项目目录的文件拼进 prompt,适合修跨文件的引用错误
  • 接入 CI:在 GitHub Actions 里跑,自动修 PR 里的测试失败

关于 API 费用

这个工具每次修复大概消耗 1000~3000 token(取决于代码长度),用 gpt-4.1 的话一次修复费用在 ¥0.01 左右,跑个 5 轮也就几分钱。

我自己在用 无量 API,国内直连不用梯子,OpenAI / Claude / Gemini / DeepSeek 300+ 模型都在一个 key 里,只改 base_url 就能切换,比官方便宜 65%,余额永久不过期。新用户注册送 ¥1,够你把今天这个工具跑好几百次。


你用 Codex 或者 Claude Code 写代码时遇到过什么奇葩 bug?欢迎评论区说说,顺手点个赞让更多人看到这个工具。