Python venv 快速参考指南
一些有用的 venv 命令
[Venv 是一个虚拟环境管理命令行工具](https://www.glukhov.org/zh-cn/post/2025/05/python-venv-cheatsheet/ “Venv 快速参考和最实用的命令。)。 与 Anaconda 相比,这是一个更简单的工具。 以下是一些实用的 venv 命令。
仅仅让你知道,我认为在 Python 的包和环境管理方面,有一个比 venv 更好的工具——uv。请查看:uv - 新的 Python 包、项目和环境管理器
Python venv 快速参考
创建虚拟环境
-
标准命令(Python 3.3+):
python -m venv venv
这会在当前目录中创建一个名为
venv
的虚拟环境。 -
使用特定 Python 版本(如果已安装):
python3.10 -m venv venv
或使用
virtualenv
:virtualenv -p /usr/local/bin/python3.10 venv
(需要
virtualenv
包)。
激活虚拟环境
- 在 Windows 上:
.\venv\Scripts\activate
- 在 macOS/Linux 上:
此时命令行提示符应显示环境名称。source venv/bin/activate
停用虚拟环境
- 所有平台:
这将返回到你的系统 Python。deactivate
安装包
- 使用 pip:
示例:pip install
pip install numpy pandas
- 升级 pip(推荐):
python -m pip install --upgrade pip
冻结和导出依赖
- 保存当前环境中的包:
pip freeze > requirements.txt
- 从 requirements 文件安装:
在运行这些命令之前,请确保虚拟环境已激活。pip install -r requirements.txt
删除虚拟环境
deactivate
rm -rf <env path>
管理 Python 虚拟环境时的常见陷阱
忘记激活虚拟环境
- 一个常见的错误是不激活目标虚拟环境就运行命令,这会导致包安装到全局环境或错误的 venv 中。这可能会导致依赖冲突和不可预测的行为。
不固定包版本
- 在
requirements.txt
中使用宽松的版本说明符(如>=
而不是==
)会削弱可重复性。精确的版本固定可以确保所有参与项目的人使用相同的包版本,从而防止部署或协作时出现意外问题。
混合使用全局和虚拟环境
- 意外地全局安装包或混合使用全局和虚拟环境可能会导致冲突,尤其是当不同项目需要不兼容的包版本时。始终确保你正在使用正确的环境。
将虚拟环境提交到版本控制
- 将虚拟环境目录(如
venv/
)提交到版本控制会增加仓库的大小,这是不必要的。始终将 venv 目录添加到.gitignore
中,以保持仓库的整洁。
忽视开发和生产依赖的分离
- 没有区分开发和生产依赖可能导致部署时出现臃肿或不安全的情况。使用单独的依赖文件或配置部分来分别管理。
缺乏文档和自动化
- 没有记录环境设置步骤或未能自动化该过程(通过脚本或 Makefile)会使新贡献者上手更加困难,并且难以重现环境。
不经常清理旧的环境
- 随着时间的推移,未使用的虚拟环境可能会积累,浪费磁盘空间并造成混淆。定期删除过时的 venv 可以保持工作区的整洁。
忽略系统 Python 和包管理器的边界
- 修改系统 Python 或将系统包管理器与 pip 混合使用可能会破坏系统工具并引入难以诊断的问题。始终使用 venv 来管理项目依赖,并避免干扰系统管理的包。
总结表
陷阱 | 影响 |
---|---|
忘记激活 venv | 安装包到错误的环境中 |
不固定包版本 | 不可预测的构建,难以复现的错误 |
混合使用全局和虚拟环境 | 依赖/版本冲突 |
将 venv 目录提交到版本控制 | 仓库臃肿,混乱 |
不区分开发和生产依赖 | 部署臃肿或不安全 |
缺乏文档和自动化 | 新人上手困难,设置不一致 |
不定期清理旧环境 | 磁盘空间浪费,混淆 |
修改系统 Python 或包 | 系统不稳定,工具损坏 |
遵循最佳实践,例如始终激活 venv、固定依赖项、分离环境并维护清晰的文档,可以帮助你避免这些常见陷阱。
Conda 环境与虚拟环境在可重复性方面的关键差异
特性 | Conda 环境 | Python 虚拟环境(venv/virtualenv) |
---|---|---|
管理范围 | 管理 Python 包 和 非 Python 依赖项(如系统库、编译器) | 仅通过 pip 管理 Python 包 |
Python 版本控制 | 可指定并安装每个环境的任意 Python 版本 | 使用系统安装的 Python 版本 |
跨平台一致性 | 由于管理所有依赖项,因此在不同操作系统(Windows、macOS、Linux)上更一致 | 依赖系统库,这可能因操作系统而异 |
包来源 | 使用 Conda 仓库(预编译二进制文件、科学堆栈) | 使用 PyPI(pip)为 Python 包 |
可重复性 | 对于复杂、科学或混合语言项目可重复性更高;可以导出完整环境(conda env export ) |
对纯 Python 项目可重复性良好;如果涉及系统依赖项,可能缺乏可重复性 |
非 Python 依赖项 | 可安装和管理(如 OpenBLAS、libpng) | 无法管理;必须单独安装 |
环境导出/导入 | conda env export / conda env create 用于完整可重复性 |
pip freeze > requirements.txt / pip install -r requirements.txt (仅限 Python 包) |
性能 | 对大型科学包(如 numpy、pandas)更快、更可靠 | 在 Windows 上可能需要从源代码编译 |
复杂性 | 设置和管理开销略高 | 轻量级,适合基本 Python 项目 |
关键要点总结
-
Conda 环境 适用于需要 Python 和非 Python 依赖项的项目,或在跨平台精确复制至关重要的项目。Conda 管理整个堆栈,包括 Python 本身、库甚至编译器,使共享和重现复杂环境更容易,尤其是在数据科学和研究环境中。
-
Python 虚拟环境(
venv
/virtualenv
)轻量且适合隔离纯 Python 项目的依赖项。然而,它们无法管理系统级或非 Python 依赖项,因此如果项目依赖外部库或特定系统配置,可重复性可能会受到影响。 -
导出和共享环境:Conda 允许你导出完整的环境规范(
conda env export
),包括所有依赖项及其版本,可以在其他地方精确重现。使用虚拟环境时,pip freeze
仅捕获 Python 包,不包括系统依赖项或 Python 解释器版本。 -
结论
在科学、跨平台或 复杂项目 中使用 Conda 以实现最大可重复性。 在系统依赖项不重要的轻量级、纯 Python 项目中使用 Python 虚拟环境。