Python虚拟环境入门:虚拟环境如何工作、如何自定义创建和管理&管理工具venv、Virtualenv、conda

文章目录

    • 一、虚拟环境介绍
      • 1.1 为什么需要虚拟环境
      • 1.2 什么是虚拟环境
        • 1.2.1 venv常用命令
        • 1.2.2 虚拟环境的文件夹结构
        • 1.2.3 虚拟环境的隔离性
    • 二、虚拟环境是如何工作的
      • 2.1 复制结构和文件
      • 2.2 调整前缀查找过程
        • 2.2.1 系统前缀查找过程
        • 2.2.2 虚拟环境前缀查找过程
      • 2.3 链接回标准库
      • 2.4 修改 `PYTHONPATH` 环境变量
      • 2.5 虚拟环境激活时更改 shell `PATH` 变量
      • 2.6 使用绝对路径运行虚拟环境
    • 三、自定义虚拟环境
    • 四、如何管理虚拟环境
      • 4.1 虚拟环境的创建方式
      • 4.2 虚拟环境是可丢弃的
      • 4.3 虚拟环境的可重现性
      • 4.4 避免在生产环境中使用虚拟环境
    • 五、其它虚拟环境工具
      • 5.1 Virtualenv
      • 5.2 Conda
      • 5.3 不同虚拟环境管理工具的对比
      • 5.4 使用第三方工具

  • 原文:《Python Virtual Environments: A Primer》、课程视频、课程测试
  • venv官方文档、virtualenv文档、
  • Miniconda官网、Anaconda官网、conda文档

  本教程将指导您学习使用 Python 的 venv 模块创建和管理虚拟环境,该模块是Python标准库的一部分,且一直是官方推荐的创建虚拟环境的方法。虚拟环境允许开发者为不同的项目创建隔离的Python运行环境,这样可以避免不同项目之间的依赖冲突,并且可以灵活地管理项目所需的Python版本和库。

一、虚拟环境介绍

1.1 为什么需要虚拟环境

使用Python虚拟环境有以下几个关键原因:

  1. 避免系统污染
      Linux和macOS等操作系统通常预装有Python,并用于系统内部任务。如果在系统的全局Python环境中安装外部软件包,这些软件包可能与系统相关的软件包混合,导致意外的副作用,影响操作系统的正常行为。此外,如果操作系统进行更新,可能会覆盖和丢失已安装的软件包,导致工作中断和问题。

  2. 解决依赖冲突
      不同的项目可能需要使用不同版本的外部库,而在全局环境中只能安装一个版本,所以会导致版本冲突问题。使用虚拟环境可以为每个项目创建独立的环境,从而安装所需的不同版本库,避免版本覆盖和冲突。

  3. 最小化可重现性问题
      将所有软件包集中在全局环境中会导致很难区分哪些依赖属于哪个项目,这对项目的可维护性和共享性是不利的。
      假设你同时在进行一个网络爬虫项目和一个Flask应用,并将所需的所有软件包都安装在全局环境中,这样会难以明确区分不同项目的依赖。如果使用虚拟环境,每个项目的依赖都会在其独立环境中,这样可以更轻松地读取项目需求并与他人共享,减少错误和混淆。

  4. 避免安装权限限制
      在一些公司环境中,用户可能没有管理员权限,无法在主机Python的site-packages目录中安装软件包。虚拟环境在用户权限范围内创建新的安装位置,无需管理员权限即可安装和使用外部软件包。

1.2 什么是虚拟环境

1.2.1 venv常用命令
venv常用命令 说明
python -m venv 在当前目录下创建虚拟环境
\Scripts\activate 激活虚拟环境
deactivate 退出虚拟环境
pip install 在激活的虚拟环境中安装软件包
pip list 列出虚拟环境中已安装的软件包
pip uninstall 卸载虚拟环境中的软件包
pip freeze > requirements.txt 将当前虚拟环境中的包导出到requirements.txt文件
pip install -r requirements.txt requirements.txt文件安装包到虚拟环境
python -m pip install --upgrade pip 升级虚拟环境中的pip版本

  以上是venv常用命令,这些命令帮助用户在Windows平台上创建、管理和使用Python虚拟环境。那到底什么是Python虚拟环境?

  Python虚拟环境本质上是一个文件夹结构,复制或软链接了Python可执行文件。它为用户提供了运行一个轻量且隔离的Python环境所需的一切,使用户能够在其中运行Python程序,并安装和管理与该环境相关的库和包,而不会影响到全局的Python环境或其他项目的环境。

虚拟环境只是一个文件夹结构,这意味着您可以随时删除和重新创建。

1.2.2 虚拟环境的文件夹结构

创建虚拟环境时,venv模块会生成以下的基本文件和文件夹结构:

PS> tree venv\ /F
venv\
│
├── Include\
│
├── Lib\
│   │
│   └── site-packages\
│       │
│       ├── pip\
│       │
│       └── pip-24.2.dist-info\
│
│
├── Scripts\
│   ├── Activate.ps1
│   ├── activate
│   ├── activate.bat
│   ├── deactivate.bat
│   ├── pip.exe
│   ├── pip3.12.exe
│   ├── pip3.exe
│   ├── python.exe
│   └── pythonw.exe
│
└── pyvenv.cfg
  • Include\:初始为空的文件夹,供安装依赖C扩展的包使用,以存放C头文件。
  • Lib\:包含site-packages\\文件夹,这是虚拟环境创建的主要原因之一。site-packages\\目录用于存放在虚拟环境中安装的外部包。Python 3.12起,虚拟环境默认只包含pip
  • Scripts\:包含虚拟环境的可执行文件,如Python解释器(python.exe)、pip可执行文件(pip.exe)以及用于激活环境的脚本(如activateactivate.bat)。
  • pyvenv.cfg:关键配置文件,包含用于设置sys模块变量的键值对,决定当前Python会话使用哪个解释器和site-packages目录。
  • {name}-{version}.dist-info/:当你使用pip安装Python包时,默认会创建此目录,其中包含了关于已安装包的分发信息。

仔细查看上面的文件夹结构,可以发现虚拟环境由三个关键部分组成:

  1. Python二进制文件的副本或符号链接:用于运行与虚拟环境关联的Python解释器。
  2. pyvenv.cfg文件:存储Python会话的一些配置信息。
  3. site-packages目录:存放在该虚拟环境中安装的外部库。
  • WindowsLinux系统中,虚拟环境里的Python可执行文件可能是原始Python可执行文件的符号链接(symlink)。
  • macOS系统中,虚拟环境里的Python可执行文件总是原始文件的复制品
  • 即使site-packages目录为空,虚拟环境仍然是有效的。默认情况下,venv会安装pip,因为pip是安装Python软件包的推荐工具。
  • 如果你使用的Python版本早于3.12,那么使用venv新建的虚拟环境中,会预先安装一些包,比如setuptoolspkg_resources等,而不只有pip包。

创建虚拟环境后,可以使用pip list命令来确认pip是否已被安装:

(venv) PS> python -m pip list
Package    Version
---------- -------
pip        24.2
1.2.3 虚拟环境的隔离性

  虚拟环境的目的是在不影响全局Python环境的情况下安装外部包。为实现这一点,venv会复制或链接标准Python安装中的文件结构。不同操作系统的行为有所不同,Windows和Linux可能会创建符号链接,而macOS则总是复制。

  1. pyvenv.cfg 文件
      该配置文件包含关键的设置,用于定义虚拟环境的行为,例如Python解释器路径和是否包含系统级site-packages的访问。示例配置内容如下:

    home = C:\Users\Name\AppData\Local\Programs\Python\Python312
    include-system-site-packages = false
    version = 3.12.5
    executable = C:\Users\Name\AppData\Local\Programs\Python\Python312\python312.exe
    command = C:\Users\Name\AppData\Local\Programs\Python\Python312\python312.exe -m venv C:\Users\Name\path\to\project\venv
    
  2. 标准库访问
      虽然新建的虚拟环境文件夹结构中不包含Python标准库模块(site-packages中只有pip模块),但激活虚拟环境后,你仍然可以导入和使用标准库模块。这是因为虚拟环境实现了到系统基本Python标准库的链接。这种行为避免了复制标准库,提高了虚拟环境创建的速度和效率。

    # 新创建的虚拟环境没有安装标准库,但仍能成功导入
    
    >>> import urllib
    >>> from pprint import pp
    >>>

你可能感兴趣的:(全栈,python,virtualenv,conda)