目录

Hermes Agent Python 虚拟环境排障:uv venv pip 不一致(Ubuntu 教程)

从 venv、.venv 到 pip 恢复正常——一次典型的 Python 虚拟环境路径混乱排障

Hermes Agent Python 虚拟环境排障:uv venv pip 不一致(Ubuntu 教程)

这篇文章记录我在 Ubuntu 上安装和修复 Hermes Agent 运行环境的完整过程。虚拟环境目录名、激活方式、pip 所在位置、以及 uv 对项目环境的默认处理方式——几件事叠在一起,表面看起来像是"环境坏了",实际上只是"路径和命令没有统一"。

如果你也在 Linux 上部署 Hermes、Python 项目,或者在使用 uv 管理虚拟环境时遇到 “python 对了但 pip 不对” 的情况,这篇文章应该能帮你少走很多弯路。

一、最开始的目标

这次的目标其实很简单:在 Ubuntu 上把 Hermes Agent 配好,让它通过 LongCat API 跑起来,后面再作为整个 AI 数字工厂的策略中枢使用。

前面的基础工作都已经完成:

  • 系统更新完成
  • Python、Git、Node.js、构建工具都装好了
  • Hermes Agent 也已经成功安装
  • Hermes 的 config.yaml.envSOUL.md 等配置也都配过

看起来一切都已经成了,真正的问题出现在运行环境层——也就是 Python 虚拟环境这一层。

二、问题是怎么暴露出来的

最开始我检查 Hermes 的运行环境时,发现一个非常奇怪的现象:

(venv) oklife@oklife-ub:~/.hermes/hermes-agent$ which python
/home/oklife/.hermes/hermes-agent/venv/bin/python

(venv) oklife@oklife-ub:~/.hermes/hermes-agent$ which pip
/usr/bin/pip

python 指向的是 Hermes 自己的虚拟环境,但 pip 却还在指向系统环境。

更麻烦的是,python -m pip 甚至提示当前环境里没有 pip 模块:

(venv) oklife@oklife-ub:~/.hermes/hermes-agent$ python -m pip -V
/home/oklife/.hermes/hermes-agent/venv/bin/python: No module named pip

这就很容易让人误判成"整个 Hermes 环境坏了"或者"系统 Python 被污染了"。其实不是,问题要更具体一点:虚拟环境本身存在,但里面没有完整的 pip 体系

进一步检查后发现了三个叠加的根因:

  1. 虚拟环境目录名被我来回折腾过——有时叫 venv,有时叫 .venv
  2. uv 默认创建的是 .venv,不是 venv
  3. 有一次激活错了路径,后续命令跑到了系统 Python 上,触发了 Debian/Ubuntu 的外部管理保护机制(PEP 668)

于是整个问题变成了一个非常典型的 “环境路径混乱” 问题。

虚拟环境路径混乱示意图

三、最容易踩的坑:venv 和 .venv

这一点最值得单独说,因为它真的很容易绕死人。

在普通 python -m venv 的习惯里,很多人会默认创建一个叫 venv 的目录,然后用:

source venv/bin/activate

uv 的默认行为不是这样。uv venv --python 3.11 默认会创建的是 .venv,并提示你用:

source .venv/bin/activate

这就导致如果你脑子里默认想的是 venv,但实际工具创建的是 .venv,那后面的激活命令就会直接失效。

我中间就犯了这个错误:

# 我删掉了 venv
rm -rf venv

# uv 创建的是 .venv(不是 venv!)
uv venv --python 3.11
# 输出:Creating virtual environment at: .venv

# 但我以为还是 venv,执行了错误的激活命令
source venv/bin/activate
# bash: venv/bin/activate: 没有那个文件或目录

这一步直接没激活成功,后面的所有命令都跑偏了。

四、为什么 ensurepip 把我带进了系统环境

当时为了补 pip,我尝试了 python -m ensurepip --upgradepython -m pip install -U pip setuptools wheel

结果很快就被 Ubuntu 的系统 Python 保护机制拦住了:

error: externally-managed-environment

× This environment is externally managed
╰─> To install Python packages system-wide, try apt install python3-xyz

这说明什么?说明那一刻我实际上已经没有在虚拟环境里了,而是在系统 Python 上执行命令。

也就是说,问题不是 ensurepip 有问题,而是前面虚拟环境根本没激活对,导致后续所有包安装命令都被送到了系统 Python 上。

五、真正的关键发现:uv venv 默认不带 pip

后来我进一步确认,终于把核心问题找出来了:

uv venv 默认创建的虚拟环境里,未必自动带有 pip。

这才是最核心的点。

也就是说,哪怕你成功激活了 .venv,如果它内部没有 pip 模块,那么:

  • which python 会是对的 ✅
  • python -m pip 会报 No module named pip
  • pip -V 也可能继续落回系统 pip ❌

这时候很多人会误以为"虚拟环境坏了",其实不是,它只是没把 pip 预装进去

uv venv seed vs no-seed 对比图

六、正确的修复方式

当我把问题彻底看清楚后,修复方式就很明确了。

方案一:直接给当前环境补 pip(推荐)

在激活虚拟环境后执行:

uv pip install pip

这一步会把 pip 装进当前 .venv 环境中。这其实是最直接、最省事的修法。

方案二:创建时就带上 seed

如果你想在创建环境时就顺手把 pip 带进去,可以用:

uv venv --seed --python 3.11

这个方式更干净,后续就不用再额外补 pip。

七、最终修复过程

最后我采用了统一 .venv 的方式来整理这个环境。

整体过程如下:

# 1. 进入项目目录
cd ~/.hermes/hermes-agent

# 2. 清理旧环境(同时删掉 venv 和 .venv,避免混用)
rm -rf venv .venv

# 3. 用 uv 创建新环境(默认创建 .venv)
uv venv --python 3.11

# 4. 激活新环境
source .venv/bin/activate

# 5. 同步项目依赖(--active 确保在当前激活环境同步)
uv sync --active

# 6. 补装 pip(如果没带 --seed)
uv pip install pip

然后验证:

which python
# /home/oklife/.hermes/hermes-agent/.venv/bin/python ✅

which pip
# /home/oklife/.hermes/hermes-agent/.venv/bin/pip ✅

python -m pip -V
# pip 26.1.1 from .../.venv/lib/python3.11/site-packages/pip (python 3.11) ✅

pip -V
# pip 25.1.1 from /usr/lib/python3/dist-packages/pip (python 3.14) ⚠️

等等,最后一个 pip -V 还是显示系统 pip?

这里需要解释一下:pip -V 显示的是 shell 命令解析的结果。当你单独敲 pip 时,bash 可能优先匹配到了 /usr/bin/pip(系统路径在 PATH 中仍占有一席之地)。但这不影响你在虚拟环境里正常工作——which pippython -m pip 都是对的,就说明环境没问题。

以后装包、查包、同步依赖,统一用这两种方式之一:

uv pip install <包名>
# 或者
python -m pip install <包名>

不要再依赖裸的 pip 去判断环境是否正确,优先看 which pippython -m pip -V

最后确认 Hermes 正常:

hermes --version
# Hermes Agent v0.14.0 ✅

八、这次修复里最重要的经验

这次最重要的教训,其实不是某一个命令,而是对整个环境的理解。

1. 先分清主体和运行环境

Hermes 本体的配置和数据,主要在:

  • ~/.hermes/config.yaml
  • ~/.hermes/.env
  • ~/.hermes/sessions/
  • ~/.hermes/skills/
  • ~/.hermes/logs/

这些不属于 Python 虚拟环境。

.venvvenv 只是 Hermes 的 Python 运行层。删掉、重建、补包,影响的是运行环境,不是主体数据。

2. 不要同时维护多个环境名

venv.venv 最好只保留一个。否则你会不断遇到:

  • 激活错目录
  • 命令落到系统 Python
  • pip 指向不一致
  • uv sync 自己建新环境

最后把问题越弄越复杂。

3. 检查环境别只看提示符

终端前面的 (venv)(hermes-agent) 不一定代表一切都对了。最可靠的判断永远是:

which python
which pip
python -m pip -V

这三条一出,环境到底有没有对,立刻就能看出来。

4. 系统 Python 不要动

Ubuntu 这类系统现在越来越严格,系统 Python 往往受 PEP 668 限制。不要试图在系统 Python 里直接 pip install,否则很容易进入不可预期状态。

九、一句话总结

uv pip install pip——如果以后再遇到"虚拟环境里没有 pip"的问题,优先先试这条。

整个问题的本质就是:uv 默认创建的环境不带 pip,而我之前误以为它带了,导致激活和验证步骤全部错位。一旦理清了这个逻辑,修复就是一行命令的事。


参考来源


本文基于 2026 年 5 月 21 日实际操作的完整记录整理。