用 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 做技术调研这类实战内容。