Python 包与环境:分清解释器、虚拟环境、项目元数据与锁文件
Python 项目最常见的混乱不是“不会安装包”,而是把解释器、虚拟环境、installer、resolver、项目管理器和锁文件当成同一个东西。python 指向谁、包安装到哪里、依赖由什么文件声明、锁定是否跨平台、构建后端如何工作,必须分别回答。
三条工具路线
| 文章 | 负责什么 | 主要边界 |
|---|---|---|
| pip 与 venv | 标准虚拟环境、包安装、requirements / constraints、wheel、index 和 cache | requirements 不天然等于跨平台 lock;使用 pip lock 前要从当前 pip --help 与官方命令页确认支持状态 |
| Poetry | 项目元数据、依赖解析、lock、group、环境和 build | Poetry 2 的元数据与旧教程不同;工具环境不应污染项目环境 |
| uv | Python 与项目环境入口、解析、lock、workspace、uv pip 和 CI | 高速不等于与 pip 完全兼容;解释器来源也需供应链批准 |
先找准解释器与安装位置
先在项目外记录命令解析,再在项目内记录环境:
python --version
python -m pip --versionWindows 还应核对 py -0p,Unix 类系统应核对 command -v python python3。Poetry 和 uv 也要记录可执行文件来源。不要先激活一个历史 .venv 再做基线判断,否则输出已经被旧环境污染。
项目至少应明确:支持的 Python 范围、开发基线、虚拟环境位置、pyproject.toml 或 requirements 入口、lock / constraints 策略、私有 index、原生扩展 toolchain 和 CI 安装命令。
共同证据链
删除或移走旧虚拟环境,从批准解释器创建新环境。用冻结或 locked 语义恢复依赖,不允许安装过程静默改写声明。记录解析来源、wheel / sdist 选择、平台 tag 和构建隔离行为。
运行测试、类型检查或最小入口,确认实际解释器和 site-packages。清理环境和缓存后重建;有离线要求时验证批准 wheelhouse 或内部 index。在 CI 使用相同项目入口,并把 OS、架构和 Python 版本差异作为显式矩阵。
共同风险
pip 命令与 python 不属于同一解释器,包被装进错误环境。只在一个平台生成依赖结果,却把它当成所有 Python、OS 和架构的通用锁。私有包名请求泄露到公共 index,或多源优先级引发 dependency confusion。
sdist 在安装时执行构建后端,原生编译器、系统库和网络访问变成隐式输入。.venv、wheel cache 和 uv cache 掩盖缺失声明;复制虚拟环境不能替代重建。index token、HTTP basic auth、内部路径和构建日志被写入配置、命令历史或 CI 输出。
团队落地检查
每篇文章都从干净环境创建、安装、验证、清理并再次恢复。能解释 manifest、lock / constraints、环境和 cache 各自责任,不用文件名类比其他生态。私有 index、代理、CA、凭证、hash、wheel / sdist 和构建隔离有明确判断路径。
工具升级先在代表性 OS、Python 和原生依赖项目验证,失败有旧工具与旧 lock 回滚入口。官方仍标实验或存在兼容差异的能力明确标注,不能用模型记忆写成稳定事实。
如果 python 本身无法稳定解析,应先回到 01 开发机基础环境修正解释器安装和版本管理;如果失败发生在 PyPI / 私有仓库发布、保留或晋级,则沿 18 制品治理继续排查。项目侧需要留下的证据,是依赖声明、解析结果、环境位置和恢复命令能否共同重建同一运行环境。
