MK
摩柯社区 - 一个极简的技术知识社区
AI 面试

Python虚拟环境的激活与退出

2024-05-295.6k 阅读

虚拟环境基础概念

在深入探讨 Python 虚拟环境的激活与退出之前,我们先来了解一下什么是虚拟环境以及它为什么如此重要。

虚拟环境的定义

简单来说,虚拟环境是 Python 解释器的一个独立副本,在这个副本中,你可以安装特定版本的包,而不会影响系统级别的 Python 安装。这就好比是一个隔离的空间,你可以在里面随心所欲地摆弄各种 Python 包及其版本,而不用担心会对其他项目或者系统的 Python 环境造成干扰。

从技术层面讲,虚拟环境创建了一个包含特定 Python 解释器、标准库以及 site-packages 目录的独立环境。这个 site-packages 目录是安装第三方包的地方,每个虚拟环境都有自己独立的 site-packages,这就使得不同虚拟环境之间的包相互隔离。

虚拟环境的重要性

  1. 项目依赖管理:不同的 Python 项目可能依赖于同一包的不同版本。例如,项目 A 依赖 Django 2.2,而项目 B 依赖 Django 3.0。如果没有虚拟环境,在同一系统中同时满足这两个项目的依赖几乎是不可能的,因为安装一个版本的 Django 会覆盖另一个版本。而虚拟环境可以让每个项目拥有自己所需版本的 Django,互不干扰。
  2. 开发与部署一致性:在开发过程中,我们希望开发环境和部署环境尽可能一致。虚拟环境可以将开发过程中使用的包及其版本完整地记录下来,在部署时可以通过相同的虚拟环境配置来确保环境的一致性,减少因环境差异导致的问题。
  3. 避免系统污染:直接在系统级 Python 环境中安装大量的包,可能会导致系统环境变得混乱,而且卸载某些包时还可能影响其他依赖该包的程序。虚拟环境则将这些操作限制在一个独立的空间内,对系统环境没有影响。

创建虚拟环境

在了解了虚拟环境的基本概念和重要性之后,我们来看看如何创建虚拟环境。在 Python 中,有多种工具可以用来创建虚拟环境,其中最常用的是 venv 模块(Python 3.3 及以上版本自带)和 virtualenv 工具(适用于 Python 2.7 及以上版本)。

使用 venv 模块创建虚拟环境

venv 模块是 Python 标准库的一部分,从 Python 3.3 开始引入,使用起来非常方便。

  1. 创建基本虚拟环境 在命令行中,进入你想要创建虚拟环境的目录,然后执行以下命令:
python3 -m venv myenv

这里 myenv 是你给虚拟环境取的名字,你可以根据自己的喜好进行修改。执行上述命令后,会在当前目录下创建一个名为 myenv 的目录,这个目录就是你的虚拟环境。

  1. 指定 Python 解释器版本 如果你系统中安装了多个版本的 Python,并且想要指定使用某个特定版本的 Python 来创建虚拟环境,可以通过以下方式: 假设你安装了 Python 3.8 和 Python 3.9,并且想要使用 Python 3.8 创建虚拟环境,可以这样做:
python3.8 -m venv myenv38

这样就会使用 Python 3.8 来创建名为 myenv38 的虚拟环境。

  1. 创建包含额外包的虚拟环境 有时候,你可能希望在创建虚拟环境时就预装一些常用的包。例如,你希望在创建虚拟环境时就安装 numpypandas,可以使用 --prompt 选项结合 pip 来实现:
python3 -m venv --prompt="myenv [numpy,pandas]" myenv
source myenv/bin/activate
pip install numpy pandas

上述命令首先创建了一个名为 myenv 的虚拟环境,并设置了一个自定义的提示符,然后激活虚拟环境并安装了 numpypandas

使用 virtualenv 工具创建虚拟环境

virtualenv 是一个非常流行的第三方工具,即使在 Python 版本低于 3.3 的情况下也能使用,而且功能十分强大。

  1. 安装 virtualenv 如果你的系统中没有安装 virtualenv,可以使用 pip 进行安装:
pip install virtualenv
  1. 创建虚拟环境 安装好 virtualenv 后,在命令行中进入想要创建虚拟环境的目录,然后执行以下命令:
virtualenv myenv

同样,myenv 是虚拟环境的名字,你可以自行修改。这会在当前目录下创建一个名为 myenv 的虚拟环境。

  1. 指定 Python 解释器版本venv 类似,virtualenv 也可以指定使用特定版本的 Python 解释器:
virtualenv -p /usr/bin/python3.8 myenv38

这里 /usr/bin/python3.8 是 Python 3.8 解释器的路径,你需要根据自己系统中 Python 解释器的实际路径进行修改。

  1. 创建具有特定依赖的虚拟环境 virtualenv 也支持在创建虚拟环境时预装一些包。你可以创建一个 requirements.txt 文件,列出你想要安装的包及其版本,例如:
numpy==1.19.5
pandas==1.1.5

然后使用以下命令创建虚拟环境并安装这些包:

virtualenv myenv -r requirements.txt

这样就会创建名为 myenv 的虚拟环境,并安装 requirements.txt 文件中列出的包及其指定版本。

激活虚拟环境

创建好虚拟环境后,就需要激活它才能在其中安装和使用包。虚拟环境的激活方式因操作系统和所使用的 shell 不同而有所差异。

在 Linux 和 macOS 上激活虚拟环境

  1. bash 和 zsh shell 如果你使用的是 bashzsh shell,激活虚拟环境的命令如下:
  • 使用 venv 创建的虚拟环境
source myenv/bin/activate

这里 myenv 是你虚拟环境的目录名。激活后,命令行提示符会发生变化,通常会在前面加上虚拟环境的名字,例如 (myenv) user@host:~/project$

  • 使用 virtualenv 创建的虚拟环境:激活方式与 venv 创建的虚拟环境相同:
source myenv/bin/activate
  1. csh 和 tcsh shell 对于 cshtcsh shell,激活命令有所不同:
source myenv/bin/activate.csh

同样,myenv 是虚拟环境的目录名。

在 Windows 上激活虚拟环境

  1. 命令提示符(CMD) 在 Windows 的命令提示符中,激活虚拟环境的命令如下:
  • 使用 venv 创建的虚拟环境
myenv\Scripts\activate.bat
  • 使用 virtualenv 创建的虚拟环境:激活命令也是一样的:
myenv\Scripts\activate.bat

激活后,命令提示符会显示虚拟环境的名字,例如 (myenv) C:\Users\user\project>

  1. PowerShell 在 PowerShell 中,激活虚拟环境的命令为:
  • 使用 venv 创建的虚拟环境
myenv\Scripts\Activate.ps1

由于 PowerShell 默认禁止运行脚本,如果你遇到权限问题,可以通过以下命令更改执行策略来允许运行脚本:

Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned

然后再次尝试激活虚拟环境。

  • 使用 virtualenv 创建的虚拟环境:激活命令同样是:
myenv\Scripts\Activate.ps1

虚拟环境激活后的操作

当虚拟环境激活后,你就可以在这个环境中安装、升级和管理包了,这些操作只会影响当前虚拟环境,而不会对系统级 Python 环境产生影响。

安装包

在激活的虚拟环境中,使用 pip 安装包非常简单。例如,要安装 requests 包,可以执行以下命令:

pip install requests

这会将 requests 包及其依赖安装到当前虚拟环境的 site-packages 目录中。

升级包

如果某个包有新版本可用,你可以使用 pip 进行升级。例如,要升级 numpy 包,可以执行:

pip install --upgrade numpy

查看已安装的包

你可以使用 pip list 命令查看当前虚拟环境中已安装的所有包及其版本:

pip list

这会列出所有已安装包的名称和版本号,例如:

Package    Version
---------- -------
numpy      1.19.5
pandas     1.1.5
requests   2.25.1

导出依赖列表

为了方便在其他地方(如部署环境)重新创建相同的虚拟环境,你可以导出当前虚拟环境中已安装包的列表。使用以下命令可以将已安装的包及其版本信息导出到 requirements.txt 文件中:

pip freeze > requirements.txt

requirements.txt 文件的内容类似如下:

numpy==1.19.5
pandas==1.1.5
requests==2.25.1

退出虚拟环境

当你完成了在虚拟环境中的操作,不再需要使用它时,就可以退出虚拟环境。退出虚拟环境的操作也因操作系统和 shell 而异。

在 Linux 和 macOS 上退出虚拟环境

bashzshcshtcsh shell 中,无论虚拟环境是用 venv 还是 virtualenv 创建的,退出虚拟环境的命令都是:

deactivate

执行这个命令后,命令行提示符会恢复到激活虚拟环境之前的状态。

在 Windows 上退出虚拟环境

  1. 命令提示符(CMD) 在命令提示符中,退出虚拟环境的命令为:
deactivate.bat
  1. PowerShell 在 PowerShell 中,退出虚拟环境的命令为:
deactivate.ps1

执行相应的退出命令后,虚拟环境就会被停用,你又回到了系统级的 Python 环境或者其他未激活虚拟环境的状态。

高级虚拟环境操作

除了基本的创建、激活、使用和退出虚拟环境之外,还有一些高级操作可以帮助你更好地管理虚拟环境。

嵌套虚拟环境

在某些情况下,你可能需要在一个已经激活的虚拟环境中再创建一个虚拟环境,这就是嵌套虚拟环境。虽然这种情况并不常见,但在一些复杂的开发场景中可能会用到。

  1. 创建嵌套虚拟环境 假设你已经激活了一个名为 outerenv 的虚拟环境,现在要在其中创建一个名为 innerenv 的嵌套虚拟环境。在激活的 outerenv 中,使用 venv 模块创建嵌套虚拟环境的命令如下:
python -m venv innerenv

使用 virtualenv 创建的命令类似:

virtualenv innerenv
  1. 激活嵌套虚拟环境 激活嵌套虚拟环境的方式和普通虚拟环境一样,在激活的 outerenv 中进入 innerenv 目录并激活:
source innerenv/bin/activate

在 Windows 上,根据不同的 shell 使用相应的激活命令。

  1. 退出嵌套虚拟环境 退出嵌套虚拟环境同样使用 deactivate 命令,当你退出嵌套虚拟环境后,会回到外层虚拟环境。如果要完全退出所有虚拟环境,需要再次执行 deactivate 命令退出外层虚拟环境。

共享虚拟环境

在团队开发中,共享虚拟环境可以确保团队成员拥有一致的开发环境。虽然不能直接共享整个虚拟环境目录,但可以通过共享 requirements.txt 文件来实现。

  1. 生成 requirements.txt 文件 在开发过程中,每当安装或升级了包,都应该更新 requirements.txt 文件。如前文所述,使用以下命令可以生成或更新 requirements.txt 文件:
pip freeze > requirements.txt
  1. 其他成员使用 requirements.txt 创建虚拟环境 团队中的其他成员可以根据共享的 requirements.txt 文件创建具有相同依赖的虚拟环境。首先创建一个新的虚拟环境,例如使用 venv
python -m venv myenv
source myenv/bin/activate

然后在激活的虚拟环境中安装 requirements.txt 文件中的包:

pip install -r requirements.txt

这样其他成员就可以拥有与你几乎相同的虚拟环境,减少因环境差异导致的问题。

虚拟环境的迁移

有时候你可能需要将虚拟环境从一个系统迁移到另一个系统。虽然不能简单地复制虚拟环境目录,但可以通过以下步骤实现迁移:

  1. 导出依赖列表 在原系统中激活虚拟环境,然后导出 requirements.txt 文件:
pip freeze > requirements.txt
  1. 在目标系统创建虚拟环境并安装依赖 在目标系统中,首先创建一个新的虚拟环境,例如使用 virtualenv
virtualenv myenv
source myenv/bin/activate

然后将原系统中导出的 requirements.txt 文件复制到目标系统,并在激活的虚拟环境中安装依赖:

pip install -r requirements.txt

通过这种方式,就可以在目标系统中重建一个与原系统相似的虚拟环境。不过需要注意的是,某些包可能依赖于系统特定的库或配置,这种情况下可能需要额外的手动配置。

虚拟环境常见问题及解决方法

在使用虚拟环境的过程中,可能会遇到一些问题,下面我们来看看一些常见问题及其解决方法。

激活虚拟环境失败

  1. 权限问题 在 Windows 的 PowerShell 中,如果遇到激活脚本无法执行的问题,通常是因为执行策略限制。如前文所述,可以通过以下命令更改执行策略:
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned

在 Linux 和 macOS 上,如果提示权限不足,可以检查虚拟环境目录及其脚本的权限,确保当前用户有执行权限。例如,对于 venv 创建的虚拟环境,可以使用以下命令修改权限:

chmod +x myenv/bin/activate
  1. 路径问题 如果虚拟环境的路径中包含空格或特殊字符,可能会导致激活失败。尽量避免在虚拟环境路径中使用空格和特殊字符。如果已经创建了这样的虚拟环境,可以尝试将其移动到一个路径简单的位置。

安装包失败

  1. 网络问题 如果在安装包时遇到网络连接问题,例如超时或下载失败,可以检查网络连接是否正常。你可以尝试使用 ping 命令测试网络,或者更换网络环境。另外,有些包的安装源可能不稳定,可以尝试更换 pip 的安装源。例如,使用清华大学的 pip 源:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple somepackage
  1. 依赖问题 某些包可能依赖于其他系统级的库,如果缺少这些库,安装可能会失败。例如,安装 numpy 时可能依赖于 BLASLAPACK 库。在 Linux 系统上,可以通过包管理器安装这些依赖,例如在 Ubuntu 上:
sudo apt-get install libblas-dev liblapack-dev

在 macOS 上,可以使用 brew 安装:

brew install openblas

虚拟环境中的 Python 版本与预期不符

  1. 创建时指定错误 如果在创建虚拟环境时指定 Python 版本错误,可以重新创建虚拟环境并正确指定 Python 版本。例如,使用 venv 创建特定版本 Python 的虚拟环境:
python3.8 -m venv myenv38
  1. 系统中 Python 版本混乱 如果系统中安装了多个 Python 版本,并且环境变量配置不正确,可能会导致虚拟环境使用错误的 Python 版本。可以检查 PATH 环境变量,确保正确的 Python 版本路径在 PATH 中靠前。在 Linux 和 macOS 上,可以编辑 .bashrc.zshrc 文件,例如:
export PATH="/usr/local/bin/python3.8:$PATH"

在 Windows 上,可以通过系统属性 - 高级 - 环境变量来编辑 PATH 环境变量。

总结虚拟环境激活与退出的要点

虚拟环境的激活与退出是 Python 开发中非常基础且重要的操作。激活虚拟环境可以让我们在独立的环境中安装和使用包,避免对系统级 Python 环境的干扰,而正确退出虚拟环境则能让我们回到正常的系统环境。在不同的操作系统和 shell 中,激活与退出的命令略有不同,需要我们熟练掌握。同时,了解虚拟环境的高级操作和常见问题解决方法,可以帮助我们更高效地使用虚拟环境,提升 Python 开发的效率和稳定性。通过合理使用虚拟环境,我们能够更好地管理项目依赖,确保开发和部署环境的一致性,为 Python 项目的成功开发和运行奠定坚实的基础。