1. 当 Claude Code 把包装进了系统 Python
你有没有遇到过这种场景:让 Claude Code 帮忙跑一个数据处理脚本,它很勤快地执行了pip install pandas,脚本也顺利跑完了。结果第二天你打开另一个项目,发现ImportError满天飞,之前好好的依赖版本全乱了。排查半天才反应过来——Claude Code 把包装到了系统全局 Python 里,而不是你项目的虚拟环境。
这个问题的隐蔽之处在于:Claude Code 执行任务时,如果检测到脚本缺依赖,它会优先“完成任务”,直接调用pip install。但它默认不会检查当前是否处于虚拟环境,也不会确认pip到底指向哪个解释器。就像让一个实习生去装软件,他不管你要装到哪个盘,直接默认塞进系统盘。
更麻烦的是,如果你同时用多个项目、多个 Python 版本,全局环境被污染后,依赖冲突会像多米诺骨牌一样倒下来。而 Claude Code 本身并不感知这些上下文,它只关心“命令是否执行成功”。
这篇文章要解决的问题很具体:如何用 TaoToken 统一管理 API Key 和请求通道,配合settings.json与虚拟环境配置,让 Claude Code 触发的 pip 安装可追踪、可复现,并且永远落在项目 venv 里,而不是系统 Python。适合正在用 Claude Code 做 Python 开发、又不想被环境问题反复折腾的开发者。
2. TaoToken 前置:统一 Key 与请求通道
在动手改配置之前,先花两分钟把 TaoToken 的接入准备好。它的作用是把模型请求的入口统一到一个地址,这样你在settings.json里配置一次,后续所有 Claude Code 的模型调用都走同一条通道,方便排查和切换。
你需要先拿到一个 API Key。打开控制台页面,创建一个新的 Key,复制保存好。这个 Key 后面会写进settings.json的环境变量里。
- 控制台入口:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite
- API Keys 管理:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite
- 接入文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite
API 基础地址是https://taotoken.net/api,这个地址在配置里会用到。注意不要在后面加多余的路径,Claude Code 的 Anthropic 兼容层会自动拼接。
提示:Key 只显示一次,建议创建后立刻写入项目的
.env或系统环境变量,不要直接硬编码在会提交到 Git 的文件里。
如果你还没决定用哪个模型,可以先在模型对话页面测试一下连通性,确认 Key 和地址都没问题,再进入下一步的配置环节。
- 模型对话测试:https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite
3. 可复制配置:settings.json 骨架与虚拟环境约束
这一节是核心。我们要做两件事:第一,让 Claude Code 的模型请求走 TaoToken 的统一通道;第二,给 Python 操作加上“安全围栏”,强制 pip 只能在虚拟环境里工作。
3.1 settings.json 骨架
在项目根目录创建.claude/settings.json(如果目录不存在就新建),写入以下内容。把YOUR_TAOTOKEN_API_KEY替换成你刚才拿到的 Key。
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "YOUR_TAOTOKEN_API_KEY", "PIP_REQUIRE_VIRTUALENV": "true", "PIP_RESPECT_VIRTUALENV": "true", "PYTHONNOUSERSITE": "1" }, "permissions": { "allow": [ "Bash(python -m venv:*)", "Bash(source .venv/bin/activate:*)", "Bash(pip install:*)", "Bash(python:*)" ], "deny": [ "Bash(pip install --user:*)", "Bash(sudo pip:*)" ] } }这里几个环境变量的作用需要说清楚:
PIP_REQUIRE_VIRTUALENV=true是最关键的一条。它会让 pip 在非虚拟环境下直接报错退出,而不是默默装到全局。这样即使 Claude Code 执行了pip install,只要当前没激活 venv,命令就会失败,你立刻能发现。
PIP_RESPECT_VIRTUALENV=true让 pip 优先使用当前激活的虚拟环境,避免它去找系统 pip。
PYTHONNOUSERSITE=1禁用用户级 site-packages,防止包被装到~/.local/lib这种隐蔽位置。
permissions.deny里禁掉了--user和sudo pip,这两条是全局污染的常见入口。
3.2 项目级虚拟环境初始化
在项目根目录执行一次初始化,创建.venv:
python -m venv .venv source .venv/bin/activate python -m pip install --upgrade pipWindows 下激活命令换成.venv\Scripts\activate。激活后,which python应该指向.venv/bin/python,pip --version也应该显示 venv 路径。
3.3 用包装脚本统一入口
为了让 Claude Code 永远用对解释器,可以加一个轻量包装脚本run_py.sh,放在项目根目录:
#!/usr/bin/env bash set -euo pipefail PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" VENV_PY="$PROJECT_ROOT/.venv/bin/python" if [ ! -x "$VENV_PY" ]; then echo "未找到虚拟环境,请先执行: python -m venv .venv" >&2 exit 1 fi export PIP_REQUIRE_VIRTUALENV=true export PYTHONNOUSERSITE=1 exec "$VENV_PY" "$@"给它执行权限:chmod +x run_py.sh。之后所有 Python 脚本都通过./run_py.sh your_script.py运行,解释器路径被锁死在项目 venv 里。
3.4 在 CLAUDE.md 里写清规则
Claude Code 会读取项目根目录的CLAUDE.md作为上下文。加一段规则,让它知道该怎么做:
## Python 环境规则 - 所有 Python 脚本必须通过 `./run_py.sh <script.py>` 执行 - 禁止直接使用 `pip install`,如需安装依赖先列出清单并等待确认 - 安装依赖统一使用 `./run_py.sh -m pip install <pkg>` - 如果发现当前不在虚拟环境,先执行 `source .venv/bin/activate`这样 Claude Code 在生成命令时会主动参考这些约束,而不是凭默认行为乱来。
4. 验证请求:确认 pip 指向项目 venv
配置写完了,必须验证。下面这组命令可以逐条执行,确认环境真的被管住了。
4.1 检查解释器与 pip 路径
source .venv/bin/activate which python which pip python -c "import sys; print(sys.executable)" pip --version预期输出里,which python应该是/your/project/.venv/bin/python,pip --version应该显示from /your/project/.venv/lib/python3.x/site-packages/pip。如果指向/usr/bin或/usr/local/bin,说明 venv 没激活成功。
4.2 测试 PIP_REQUIRE_VIRTUALENV 是否生效
先退出虚拟环境:
deactivate pip install requests如果配置生效,这条命令应该直接报错,提示类似Could not find an activated virtualenv (required)。这就对了——它阻止了全局安装。然后重新激活 venv,再装一次,应该成功。
4.3 验证 TaoToken 通道连通
用一个最小请求确认模型通道正常。如果你装了anthropicSDK,可以这样测:
import os from anthropic import Anthropic client = Anthropic( base_url=os.environ["ANTHROPIC_BASE_URL"], api_key=os.environ["ANTHROPIC_API_KEY"], ) resp = client.messages.create( model="claude-sonnet-4-20250514", max_tokens=64, messages=[{"role": "user", "content": "回复 OK 两个字母"}], ) print(resp.content[0].text)如果返回了内容,说明 Key 和地址都通了。这一步同时验证了settings.json里的环境变量被正确加载。
4.4 检查包安装位置
装一个测试包,然后确认它落在 venv 里:
./run_py.sh -m pip install cowsay ./run_py.sh -c "import cowsay, os; print(os.path.dirname(cowsay.__file__))"输出路径应该包含.venv/lib/python3.x/site-packages。如果出现/usr/lib或~/.local,说明还有漏网之鱼,回去检查PYTHONNOUSERSITE和PIP_REQUIRE_VIRTUALENV是否真的被加载。
5. 本篇常见错排查
即使配置写对了,实际用起来还是会碰到一些坑。下面是我自己踩过的几个,按出现频率排序。
5.1 Claude Code 仍然执行了全局 pip
现象:明明设了PIP_REQUIRE_VIRTUALENV=true,但 Claude Code 还是装到了全局。
排查方向:先确认settings.json的路径对不对。Claude Code 读取的是项目根目录下的.claude/settings.json,不是用户目录的。如果你放在~/.claude/settings.json,那是全局配置,可能被项目配置覆盖或优先级不同。另外检查环境变量有没有被 shell 的.bashrc里其他设置覆盖。
5.2 venv 激活了但 pip 还是指向系统
现象:source .venv/bin/activate执行了,which python也对,但pip还是系统 pip。
原因通常是 venv 创建时用了--system-site-packages,或者 PATH 里系统 pip 的优先级更高。解决办法是重建 venv,不要加--system-site-packages,并且用python -m pip代替裸pip命令,这样永远走当前解释器的 pip 模块。
5.3 TaoToken 请求返回 401 或 404
401 一般是 Key 不对或没带上。检查ANTHROPIC_API_KEY是否被正确读取,可以在 shell 里echo $ANTHROPIC_API_KEY确认。404 通常是ANTHROPIC_BASE_URL写错了,注意结尾不要带/v1或多余斜杠,保持https://taotoken.net/api即可。
5.4 包装脚本在 Windows 下不工作
run_py.sh是 bash 脚本,Windows 原生 CMD 或 PowerShell 跑不了。两个方案:用 Git Bash 或 WSL 执行;或者写一个run_py.bat对应版本,把VENV_PY指向.venv\Scripts\python.exe。如果你主要在 Windows 上开发,建议直接用 WSL,省去路径转换的麻烦。
5.5 依赖装了但 import 失败
现象:pip install显示成功,但脚本里import报 ModuleNotFoundError。
这通常是解释器不一致导致的——装包用的 pip 和跑脚本的 python 不是同一个。用./run_py.sh -m pip install <pkg>确保装包和运行走同一个解释器,基本能解决。另外检查有没有多个 venv 目录(比如.venv和venv同时存在),包装脚本只认.venv。
6. 把 Key 和依赖都管起来
回到最初的问题:Claude Code 悄悄装包,本质上是“执行入口不统一”和“环境边界不清晰”。我们用两层约束把它管住——上层是 TaoToken 统一 API Key 和请求通道,让模型调用可追踪;下层是settings.json加虚拟环境配置,让 pip 安装可复现。
这套组合的实际效果是:Claude Code 依然能高效帮你跑脚本、装依赖,但每一步都落在你划定的范围内。系统 Python 不再被污染,项目之间的依赖不再互相打架,换一台机器只要重建 venv 就能复现同样的环境。
如果你接下来要长期用 Claude Code 做编码和 Agent 任务,可以考虑把 Key 和额度统一到 Coding Plan 里管理,避免多个项目分散配置。
- Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite
- 接入文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite
最后留一个实用习惯:每次新建项目,先跑一遍python -m venv .venv和source .venv/bin/activate,再把settings.json和run_py.sh复制进去。三分钟的准备,能省掉后面几小时的排障。