Claude Code 干了我三天的活,Codex 半小时翻车——两个AI编码CLI的真刀真枪对比
Claude Code 干了我三天的活,Codex 半小时翻车——两个AI编码CLI的真刀真枪对比
上周五下午四点,产品经理甩过来一个需求:把旧项目的Express路由全部迁移到FastAPI,37个接口,带参数校验和Swagger文档。我看了眼代码仓库,800多个文件,光路由定义就散落在14个文件里。
手动改?估计得干到下周二。
那就让AI来。我手头有两个AI编码CLI工具——Claude Code和Codex CLI。想着先各试一个接口,看看谁靠谱,再决定主力用哪个。
结果这一试,试出一堆故事。
两个工具,装法完全不同
先说装环境。
Claude Code是Anthropic出的,一行搞定:
npm install -g @anthropic-ai/claude-code
装完跑claude,弹浏览器让你OAuth登录。有API Key的可以直接设环境变量,跳过浏览器。
Codex CLI是OpenAI的,同样一行:
npm install -g @openai/codex
但有个坑——Codex必须在git仓库里才能跑。我第一次在空目录里试,直接报错退出。得先git init,或者在已有仓库里用。
关键区别在这:Claude Code可以读写当前目录的任何文件,权限控制靠--allowedTools参数。Codex默认把自己关在沙箱里,改文件得加--full-auto,连网络都得加--yolo才放开。
对,你没看错,参数名就叫--yolo。OpenAI的工程师取名确实有性格。
️ 第一个任务:迁移一个接口
我拿了一个最简单的GET接口试水——/api/users/:id,从Express的写法改成FastAPI。
Claude Code怎么干的
claude -p "把 src/routes/users.js 里的 GET /users/:id 迁移到 FastAPI,
放到 src/api/users.py,用Pydantic做参数校验,自动生成Swagger文档注释。
参考项目里已有的 src/api/items.py 的代码风格。" \
--allowedTools "Read,Edit,Write,Bash" \
--max-turns 10
Claude Code先读了users.js,又读了items.py(让它参考风格),然后直接生成了新的users.py。整个过程47秒,消耗$0.12。
生成的代码质量出乎意料——Pydantic模型、路径参数类型标注、404异常处理、甚至response_model都写好了。注释风格跟我项目里已有的保持一致。
# Claude Code生成的代码(精简版)
from fastapi import APIRouter, HTTPException
from pydantic import BaseModel
router = APIRouter(prefix="/api/users", tags=["users"])
class UserResponse(BaseModel):
id: int
name: str
email: str
@router.get("/{user_id}", response_model=UserResponse)
async def get_user(user_id: int):
"""获取指定用户信息,用户不存在返回404"""
user = await db.users.find_one({"id": user_id})
if not user:
raise HTTPException(status_code=404, detail="用户不存在")
return UserResponse(**user)
Codex怎么干的
codex exec "把 src/routes/users.js 里的 GET /users/:id 迁移到 FastAPI,
放到 src/api/users.py,用Pydantic做参数校验"
Codex也读了源文件,但它有个习惯——先跑一堆shell命令探测环境。which python3、pip list、ls src/api/,光探测就花了20多秒。
然后它生成的代码……怎么说呢,能跑,但风格跟项目完全不搭。注释是英文的,变量命名用了驼峰(项目用蛇形),连import顺序都没按isort排。
而且Codex有个让我抓狂的行为——它自己跑了个python -c "import fastapi"来验证FastAPI装没装。验证失败后,它试图pip install fastapi,被沙箱拦住了,然后输出了一大段"建议安装FastAPI"的提示。
整个过程3分12秒,大部分时间花在了"探索环境"上。
拿真实数据说话
我用同样的10个接口做了对比测试。项目是Node.js Express → Python FastAPI迁移,代码仓库847个文件。
指标Claude CodeCodex CLI 10个接口总耗时8分42秒23分17秒 生成代码能直接跑的比例9/106/10 跟项目风格一致的比例8/103/10 单次调用平均成本$0.15$0.08 自动跑测试验证会,如果项目有test命令不会,除非明确要求 遇到错误的自愈能力强,会读报错信息自动修正一般,经常需要人工干预成本上Codex便宜将近一半,但你得算上人工修正的时间。我修Codex生成的代码花了大概40分钟,Claude Code的只花了10分钟。
⚡ 批量任务:差距更大
37个接口,我不可能一个一个手动调用。两个工具都支持批量,但方式不同。
Claude Code的批量方案
Claude Code有个--continue参数,能接着上一次的会话继续干活。我这么用的:
# 第一轮:迁移前20个接口
claude -p "继续迁移 src/routes/ 下剩余的路由文件到 src/api/,
每迁移完一个文件就跑一次 pytest tests/ 验证" \
--continue --max-turns 30
它会自己按文件顺序一个一个迁移,每改完一个就跑测试。测试挂了就自己修。20个接口,一轮搞定,中间只挂了2次,都自己修好了。
Codex的批量方案
Codex没有--continue,但可以用exec一次塞多个任务:
codex --full-auto exec "迁移以下路由文件到FastAPI:
src/routes/orders.js → src/api/orders.py
src/routes/products.js → src/api/products.py
...(一口气列了15个)"
结果第4个文件就翻车了。Codex在写orders.py的时候引用了一个不存在的工具函数,它没报错,静默通过了。后面的文件全都基于这个错误的假设继续写,15个文件里有8个有同样的问题。
一个错误像多米诺骨牌一样传播,这是Codex最大的隐患。
️ 真正让我选定Claude Code的场景
迁移做到第30个接口的时候,遇到了一个复杂情况:原项目的认证中间件用了passport.js的自定义策略,里面嵌套了3层回调,还连着Redis session。
我试着让Codex处理:
codex exec "分析 src/middleware/auth.js 的认证逻辑,迁移到FastAPI的依赖注入系统"
Codex读完文件后,输出了一段分析,然后生成了代码。但它完全搞错了passport策略的执行顺序,把session验证和token验证的优先级搞反了。更离谱的是,它生成了一个不存在的passport.strategy()方法调用。
同样的任务给Claude Code:
claude -p "分析 src/middleware/auth.js 的完整认证流程,
包括passport策略的执行顺序和Redis session的读写时机,
然后迁移到FastAPI的Depends依赖注入系统。
特别注意策略优先级和session过期处理。" \
--max-turns 15
Claude Code花了2分多钟,中间读了5个相关文件(不只是auth.js,还有session配置、Redis连接、策略定义),然后生成的代码把认证流程理得清清楚楚。依赖注入的层次关系、session过期的自动续期、甚至Redis连接池的复用都考虑到了。
这个差距不是技术能力的问题,是上下文理解深度的差距。Claude Code会主动去读相关文件建立完整的心智模型,Codex倾向于只看你指定的那个文件。
成本账:便宜不等于划算
一天下来的数据:
Claude CodeCodex CLI API调用费用$4.83$2.17 人工修正时间约1.5小时约4小时 最终可用代码行数2,847行2,103行(含修正后的) 需要返工的接口数3个11个按我每小时的时间成本算,Codex"省"下来的$2.66,我多花了2.5小时去修正。怎么算都是亏的。
我的选择标准
用了整整一周,我总结出来的判断框架:
用Claude Code的场景:
用Codex的场景:
都别用的场景:
一句话建议
如果你只能选一个,选Claude Code。贵是贵了点,但它省的是你的时间。时间这玩意儿,花出去就回不来了。
如果你两个都想用,记住一个原则:简单任务给Codex省成本,复杂任务给Claude Code省脑子。别反过来,否则你会花更多时间在"教AI怎么写代码"上,那还不如自己写。
对了,最后那个37个接口的迁移项目,用Claude Code从头到尾花了6小时,API费用$4.83。如果手动写,我估计得3天。
这笔账,怎么算都值。
关注「安全值班室」公众号
每天一篇AI安全早报 + 实战攻防案例
浙公网安备 33010602011771号