Python虚拟环境

MJX2023/11/01Python虚拟环境

为什么要使用虚拟环境

Python 应用经常需要使用一些包第三方包或者模块,有时需要依赖特定的包或者库的版本,所以不能有一个能适应所有 Python 应用的软件环境,很多时候不同的 Python 应用所依赖的版本是冲突的,满足了其中一个,另一个则无法运行。解决这一问题的方法是 虚拟环境。

虚拟环境是一个包含了特定 Python 解析器以及一些软件包的自包含目录,不同的应用程序可以使用不同的虚拟环境。使用虚拟环境主要是为了 解决依赖冲突问题,而且 虚拟环境中只需要安装应用相关的包或者模块,可以给部署提供便利。

实现虚拟环境的原理

虚拟环境并不是什么新技术,主要是利用了操作系统中环境变量以及进程间环境隔离的特性。

操作系统的环境变量可以为程序提供信息和做信息交换介质,进程可以共享操作系统中的环境变量,也可以为进程指定环境变量,其中 PATH 是很重要的环境变量,用于为操作系统和程序提供可执行文件的访问路径,例如写一个程序 a.exe,存放在 D:\MyProgram 中,在命令行中执行 a.exe ,会得到提示 “无法找到程序 a.exe” ,为了让系统找到,可以将 D:\MyProgram 路径加入到 PATH 环境变量中,当输入 a.exe 时,操作系统就会从 PATH 所提供的路径中逐个查找,这时就可以找到了。

Python 虚拟环境就是利用这个特性构建的,在激活虚拟环境之时,激活脚本会 将当前命令行程序的 PATH 修改为虚拟环境的 这样执行命令就会在被修改的 PATH 中查找,从而避免了原本 PATH 可以找到的命令,从而实现了 Python 环境的隔离。

为了让开发容易区分当前环境是否虚拟环境以及是那个虚拟环境,命令提示符前会加上特殊标记。

怎么创建虚拟环境

virtualenv 工具

在 python3.3 之前,只能通过 virtualenv 创建虚拟环境,首先需要安装 virtualenv

pip install virtualenv

安装完后,在当前目录下创建一个名为 myvenv 的虚拟环境(也可以切换目录再创建)

virtualenv --no-site-packages myvenv

参数 --no-site-packages 的意思是创建虚拟环境时,不复制主环境中安装的第三方包,也就是创建一个 “干净的” 虚拟环境

virtualenv 还有很多参数,用于不同的使用场景。例如:

  • -p:用于指定 Python 解析器,默认为当前环境中的 Python
  • --no-pip:不需要安装 pip,默认为安装
  • --clear:如果创建虚拟环境的目录已经有了其他虚拟环境,清除重建

venv 模块

Python3.3 之后,可以用模块 venv 代替 virtualenv 工具,好处是不用单独安装。3.3 及之后的版本,都可以通过安装好的 Python 来创建虚拟环境:

python -m venv myvenv

在当前目录创建一个名为 myvenv 的虚拟环境

venv 也有参数,不过相比 virtualenv 少了些,这里简单介绍几个:

  • --without-pip:不需要安装 pip,默认为安装
  • --clear:如果创建虚拟环境的目录已经有了其他虚拟环境,清除重建

因为 venv 是依附于一个 Python 解析器创建的,所以不需要指定 Python 解释器版本。

怎么使用虚拟环境

虚拟环境创建好后,需要激活才能在当前命令行中使用,可以理解成将当前命令行环境中 PATH 变量的值替换掉

通过 virtualenv 和 模块 venv 创建的虚拟环境,激活方式是一样的,都运行激活脚本

  • Windows 系统中,激活脚本路径是 <myvenv>\Scripts\activate.bat,如果是 powershell 命令行,脚本换成 Activate.ps1 , 注意将 <myvenv>换成你自己的虚拟环境目录
  • Linux 系统中,激活脚本路径是 <myvenv>/bin/activate,默认脚本没有执行权限,要么设置脚本为可执行,要么用 source 命令执行,例如
source <myvenv>/bin/activate

激活后,就可以在命令行中看到虚拟环境标记。

enev.png

可以打印 PATH,命令如下:

Linux 下

echo $PATH

Windows 下

echo %PATH%

Windows PowerShell 下

$env:path

可以看到创建的虚拟环境脚本目录被加载了最前面。

注意:在虚拟环境中安装包不要加 sudo,加了的话会将包下载到全局中。

sudo pip install flask  # 千万不要这样做!直接 pip 就行!

退出虚拟环境

退出虚拟环境很简单,只需要执行 deactivate 命令就行,这个命令也在虚拟环境的脚本目录下,因为激活时,将脚本目录设置到 PATH 中了,所以可以直接使用。退出虚拟环境相当于将 PATH 恢复成原来的。

删除虚拟环境

首先需要退出虚拟环境,然后将虚拟环境所在的文件夹删除就行。

Lunux 命令:

rm -rf myvenv