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
    
    此时命令行提示符应显示环境名称。

停用虚拟环境

  • 所有平台:
    deactivate
    
    这将返回到你的系统 Python。

安装包

  • 使用 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 虚拟环境。

有用的链接