Files
task_pilot/docs/decisions/0003-python-environment.md
T

40 lines
2.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ADR-0003:Python 虚拟环境启动环境
- 状态:已接受
- 日期:2026-10-19
## 背景
直接执行虚拟环境中的 `python.exe` 只解决了当前进程使用哪个解释器,并不会自动完成命令行激活脚本所做的环境准备。脚本派生的子进程可能因此找不到虚拟环境内的工具,或受到宿主机全局 Python 环境变量污染。
## 决策
所有脚本任务在启动前统一经过后端 `python_env` 模块:
1. 只有解释器确认为 Python 时才应用 Python 专属环境。
2. 支持显式配置虚拟环境目录;未配置时从工作目录向上搜索 `.venv`、`venv`、`env`。
3. 虚拟环境必须同时存在 `pyvenv.cfg` 和 `Scripts/python.exe`,否则显式配置在任务保存时直接拒绝,自动探测则跳过无效目录。
4. 优先使用虚拟环境自己的 `Scripts/python.exe`。
5. 将 `Scripts` 目录置于 PATH 最前方,同时保留用户提供的 PATH 或宿主机 PATH,并按 Windows 大小写不敏感规则去重。
6. 注入 `VIRTUAL_ENV` 和 `VIRTUAL_ENV_PROMPT`。
7. 清理继承的 `PYTHONHOME`、`PYTHONPATH` 和旧的 `VIRTUAL_ENV` 标记。
8. 虚拟环境模式禁止用户环境重新注入 `PYTHONHOME`;显式配置的 `PYTHONPATH` 仍可在清理继承污染后重新加入。
9. 强制设置 `PYTHONUNBUFFERED=1`。
10. 未能检测到虚拟环境时,平滑回退到配置的 Python 解释器。
## 原因
- PATH 是隔离子进程工具解析的关键,不只是当前 Python 解释器路径。
- `VIRTUAL_ENV` 是第三方框架判断隔离环境的重要标识。
- 继承的 Python 全局变量可能破坏 venv 的标准库解析。
- 实时日志依赖 Python 标准流不被块缓冲。
- 仅按目录名判断不可靠,必须验证 venv 结构。
- Windows 环境变量大小写不敏感,必须主动处理 `PATH`/`Path` 重复。
## 边界
- Conda 环境不会被识别为标准 venv;当前可通过显式解释器路径运行,但不会自动设置 `CONDA_PREFIX`。
- `PYTHONUNBUFFERED` 只影响 Python 标准流。第三方日志 Handler 或非 Python 子进程仍可能自行缓冲。
- 虚拟环境路径必须是后端运行时可以访问的有效 Windows 目录。
- 使用系统 Python 时不会伪造虚拟环境变量。