技术教程 · 阅读约 8 分钟

用 30 行 Python 让 Claude 帮你审完整个代码仓库

用 30 行 Python 让 Claude 帮你审完整个代码仓库

很多人用 Claude 审代码,都是一个文件一个文件地粘贴进去。

这不仅慢,还有个更大的问题:Claude 看不到文件之间的依赖关系。它不知道你的 utils.py 被哪些模块调用,不知道你的接口定义和实现是否对齐。单文件审查,等于让医生只看化验单不看病人。

今天这篇教程,教你用 Python 写一个脚本,自动遍历整个 repo,把结构信息和代码一起喂给 Claude,让它做有上下文的整体审查。


思路

1. 递归遍历项目目录,收集所有源码文件

2. 构建一个包含目录树 + 文件内容的 prompt

3. 调用 Claude API,让它从架构层面给出审查意见

4. 输出结构化的审查报告

整个脚本不到 80 行,核心逻辑 30 行左右。


完整代码


import os

import sys

from openai import OpenAI



# 支持的源码扩展名,按需增减

CODE_EXTENSIONS = {'.py', '.js', '.ts', '.go', '.java', '.rs', '.cpp', '.c', '.h'}



# 单文件最大字符数,避免 token 超限

MAX_FILE_CHARS = 3000



def build_tree(root: str, prefix: str = "") -> str:

    """递归生成目录树字符串"""

    lines = []

    try:

        entries = sorted(os.listdir(root))

    except PermissionError:

        return ""

    for i, entry in enumerate(entries):

        if entry.startswith('.') or entry in ('node_modules', '__pycache__', '.git', 'venv'):

            continue

        path = os.path.join(root, entry)

        connector = "└── " if i == len(entries) - 1 else "├── "

        lines.append(prefix + connector + entry)

        if os.path.isdir(path):

            extension = "    " if i == len(entries) - 1 else "│   "

            lines.append(build_tree(path, prefix + extension))

    return "\n".join(filter(None, lines))



def collect_files(root: str) -> list[tuple[str, str]]:

    """收集所有源码文件,返回 (相对路径, 内容) 列表"""

    results = []

    for dirpath, dirnames, filenames in os.walk(root):

        # 跳过无关目录

        dirnames[:] = [d for d in dirnames

                       if not d.startswith('.') and d not in ('node_modules', '__pycache__', '.git', 'venv')]

        for fname in filenames:

            ext = os.path.splitext(fname)[1].lower()

            if ext not in CODE_EXTENSIONS:

                continue

            full_path = os.path.join(dirpath, fname)

            rel_path = os.path.relpath(full_path, root)

            try:

                with open(full_path, 'r', encoding='utf-8', errors='ignore') as f:

                    content = f.read(MAX_FILE_CHARS)

                    if len(content) == MAX_FILE_CHARS:

                        content += "\n... [文件过长,已截断]"

                results.append((rel_path, content))

            except Exception:

                continue

    return results



def review_repo(repo_path: str) -> str:

    client = OpenAI(

        api_key=os.environ.get("API_KEY", "your-api-key-here"),

        base_url="https://api2everything.xyz/v1",  # 国内直连,无需代理

    )



    tree = build_tree(repo_path)

    files = collect_files(repo_path)



    # 构建 prompt

    file_sections = "\n\n".join(

        f"### {path}\n```\n{content}\n```"

        for path, content in files

    )



    prompt = f"""你是一位资深代码审查工程师。请对以下代码仓库进行整体审查。



## 项目结构

{tree}




## 源码文件

{file_sections}



## 审查要求

请从以下维度给出具体意见(每条指出文件名和行为):

1. **架构设计**:模块划分是否合理,有无循环依赖

2. **潜在 Bug**:逻辑错误、边界条件、异常处理缺失

3. **安全风险**:硬编码密钥、SQL 注入、未校验输入等

4. **性能问题**:明显的低效写法

5. **改进建议**:优先级排序,给出最值得立刻修复的 3 件事



用中文回答,格式清晰。"""



    response = client.chat.completions.create(

        model="claude-sonnet-4-5",  # 或换成 claude-opus-4-5 获得更深度分析

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

        max_tokens=4096,

    )

    return response.choices[0].message.content



if __name__ == "__main__":

    repo = sys.argv[1] if len(sys.argv) > 1 else "."

    print(f"正在审查仓库:{os.path.abspath(repo)}\n")

    report = review_repo(repo)

    print(report)



    # 可选:保存报告

    with open("review_report.md", "w", encoding="utf-8") as f:

        f.write(report)

    print("\n报告已保存至 review_report.md")


使用方法


# 安装依赖

pip install openai



# 设置 API Key(用无量Api 的 key)

export API_KEY="sk-xxxx"



# 审查当前目录

python review.py .



# 审查指定项目

python review.py /path/to/your/project


几个实用技巧

控制 token 用量:MAX_FILE_CHARS = 3000 这个参数可以调。如果项目很大,调到 1500;如果只有几个核心文件,可以放到 8000 让 Claude 看得更仔细。

换模型:把 claude-sonnet-4-5 换成 claude-opus-4-5 审查会更深入,但贵一些。换成 deepseek-r1 速度快、成本极低,适合日常快速扫描。

增量审查:在 CI/CD 里用 git diff --name-only HEAD~1 拿到变更文件列表,只审查本次改动的文件,每次 PR 自动触发。

多轮追问:拿到报告后,可以继续问:"第 2 条安全风险,给我写修复代码",Claude 有上下文,能直接给出 patch。


关于费用

用官方 Claude API,claude-sonnet-4-5 审查一个中型项目大概消耗 10k-30k token,折合人民币 1-3 元一次。

我自己用的是无量Api(api2everything.xyz),同样的模型比官方便宜约 60%,国内直连不需要代理,OpenAI 格式兼容,把 base_url 改一行就能用,注册还送 ¥1 余额。对于这种批量调用的场景,省下来的钱很可观。


有问题欢迎评论区留言,比如"项目太大 token 超限怎么办"、"怎么集成进 GitHub Actions"这类问题,我看到都会回。

觉得有用的话点个赞,后续还会写 Codex 自动修 Bug、DeepResearch 做技术调研这类实战内容。