AI 命令行工具正在重塑 Python 开发者的日常工作流。不再需要来回切换浏览器和 IDE 复制粘贴,直接在终端里用自然语言下达指令,工具就能在本地仓库里读代码、写代码、跑测试。Google 推出的 Gemini CLI 和 Anthropic 推出的 Claude Code 是目前最受关注的两款终端 AI 助手。它们都能干活,但在安装门槛、代码质量、运行速度和计费逻辑上差异明显。选错工具,要么卡在配置环节,要么在复杂重构时拿到一堆跑不通的半成品。
本文从实际 Python 开发场景出发,对比这两款工具的核心差异,并给出具体的上手示例和选型建议。
安装与上手:零成本启动 vs 付费开箱
Gemini CLI 的核心优势是门槛极低。它基于 Node.js 开发,安装只需要一条 npm 命令,登录个人 Google 账号即可使用,自带每分钟 60 次、每天 1000 次请求的免费额度。对于大部分轻量级 Python 脚本修改和日常问答,这个免费池完全够用,不需要绑信用卡。
Claude Code 同样通过 npm 安装,但起步就需要 Anthropic API Key,或者订阅 Claude Max 会员。没有免费试用层。它的计费按 token 消耗走,如果丢进一个几千行的 Python 仓库让它做全局重构,一次会话的账单可能就超过几美元。上手成本直接决定了它更适合严肃的商业项目,而非随手玩的个人脚本。
Python 代码质量与性能:长上下文阅读 vs 精准手术刀
在 Python 任务中,两者的表现风格截然不同。
处理单体脚本或标准数据处理任务(比如给一个 Pandas 脚本加类型提示、修一个异步爬虫的并发逻辑),Gemini CLI 响应极快。依托 Gemini 2.5 Pro 模型的百万级上下文窗口,它能一口气吞下整个大型 Python 项目的依赖树和多个模块文件,在跨文件追踪引用时表现亮眼。但在要求精细修改时——比如“只修改第 42 行的异常捕获,不要动其他逻辑”——它有时会过度热心,顺手重构周边无关代码。
Claude Code 则像一把精准的手术刀。在 Django 或 FastAPI 这种强约定框架中,Claude Code 对 Python 的类型系统、装饰器、异步语法理解更深。它生成的代码更贴近项目现有风格,修改范围通常严格控制在指令范围内。代价是思考时间稍长,遇到大仓库时,虽然也能通过多文件索引工作,但超长上下文下的稳定性不如 Gemini。
成本与日常集成:按量计费 vs 订阅封顶
日常开发中,AI 工具的消耗很容易失控。
- Gemini CLI:免费额度适合高频低强度的操作——比如每天几十次的“帮我写个正则”、“解释一下这个报错”。超出额度后按 Google 定价走,对于个人开发者依然便宜。
- Claude Code:按 token 收费,复杂任务消耗巨大。如果你是重度用户,直接买 Claude Max 订阅(每月 100 或 200 美元)封顶更划算,否则月底账单可能让人心惊。
两者都支持与 Git 深度集成,能自动生成 commit message、解决合并冲突。Claude Code 在这部分的指令遵循度更高,生成的提交信息更符合 Conventional Commits 规范;Gemini CLI 有时会生成过于冗长的描述。
实战演练:用 CLI 重构一个混乱的 Python 脚本
下面用一个具体例子展示两者的用法。假设我们有一个写得很随意的 Python 数据处理脚本 process.py,需要加上类型提示、错误处理,并把逻辑拆分成独立函数。
原始脚本:
import json
def get_data(f):
d = open(f).read()
return json.loads(d)
def calc(d):
r = 0
for i in d['items']:
r += i['val']
return r
if __name__ == '__main__':
data = get_data('input.json')
print(calc(data))
使用 Claude Code 进行重构:
在终端中启动 Claude Code,直接下达精确指令:
# 启动 claude code
claude
# 在交互界面中输入指令(也可以直接用单行命令模式)
> 重构 process.py:为所有函数添加类型提示,用 try-except 处理文件不存在和 JSON 解析错误,把读取和计算拆成两个独立函数,主入口保持不变
Claude Code 通常会读取文件,直接在本地生成精确的 diff 并应用。重构后的结果往往非常克制,只做你要求的事:
import json
from typing import Any
def get_data(filepath: str) -> dict[str, Any]:
"""读取并解析 JSON 文件。"""
try:
with open(filepath, 'r', encoding='utf-8') as f:
return json.loads(f.read())
except FileNotFoundError:
print(f"错误:文件 {filepath} 不存在")
return {}
except json.JSONDecodeError:
print(f"错误:文件 {filepath} 不是合法的 JSON")
return {}
def calc_total(data: dict[str, Any]) -> float:
"""计算 items 中 val 的总和。"""
return sum(item.get('val', 0.0) for item in data.get('items', []))
if __name__ == '__main__':
data = get_data('input.json')
print(calc_total(data))
使用 Gemini CLI 进行同样的重构:
# 启动 gemini cli
gemini
# 输入指令
> 请为 process.py 添加类型提示和错误处理,将读取和计算拆分为独立函数
Gemini CLI 同样会直接修改本地文件。它的输出通常也是正确的,但可能会额外加上一些它认为“最佳实践”的改动——比如顺手把 if __name__ == '__main__' 块改成 argparse 命令行参数解析,或者加上 logging 替代 print。如果你只想要最小改动,需要在指令里加约束:“不要改变主入口的调用方式,不要引入新的第三方库”。
选型建议与边界提醒
没有万能工具,只有合适的工作流。可以按下面的检查清单来选:
- 选 Gemini CLI:个人项目、开源维护、需要大量跨文件上下文阅读、预算敏感、高频简单问答。
- 选 Claude Code:商业项目重构、Django/FastAPI 等强框架开发、需要严格遵循现有代码风格、团队协作中对 commit 规范有要求、愿意为高精度付费。
边界提醒:无论用哪个 CLI,生成的 Python 代码都必须跑一遍测试。AI 对依赖版本和运行时环境的感知是滞后的,它可能引入你本地没装的包,或者用错 Python 版本的语法(比如在 3.8 环境里用了 3.10 的 match 语句)。养成习惯:AI 改完代码,立刻执行 pytest 或 uv run python script.py 验证,不要盲目信任并直接推送到主干分支。