构建Python虚拟环境

102 阅读6分钟

虚拟环境原理

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

操作系统的环境变量

为程序提供信息和做信息交换介质,进程可以共享操作系统中的环境变量,我们也可以为进程指定环境变量

PATH 就是很重要的环境变量,用于为操作系统和程序提供可执行文件的访问路径

例如写一个程序 a.exe,存放在 D:\MyProgram 中,在命令行中执行 a.exe ,会得到提示“ 无法找到程序 a.exe”,为了让系统找到,可以将 D:\MyProgram 路径加入到 PATH 环境变量中,当输入 a.exe 时,操作系统就会从 PATH 所提供的路径中逐个查找,这时就可以找到了。Linux 和 MacOS 具有相似的特性,甚至比 Windows 的功能更丰富。

Python 虚拟环境

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


创建Python虚拟环境

virtualenv 工具

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

pip install virtualenv

安装完后,在当前目录下创建一个名为 myvenv 的虚拟环境:

virtualenv --no-site-packages myvenv

参数 --no-site-packages ,创建一个 “干净的” 虚拟环境

other参数,用于不同的使用场景,如:

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

venv 模块

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

python -m venv myvenv

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

venv 参数:

  • --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激活后,可以在命令行中看到虚拟环境标记

打印 PATH,命令如下:

Linux 下:

echo $PATH

Windows 下

echo %PATH%

退出

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


与开发工具配合

虽然通过激活脚本,很容易切换到虚拟环境,但是在实际开发中,还是不够方便,而且现在很多开发工具,特别是提供 Python 解析环境的开发工具,都可以和虚拟环境配合,在开发过程中几乎无感,对开发工作是很大的帮助

Visual Studio Code

  • 按下 Ctrl+Shift+P, 在弹出的命令窗口中输入 "解析器",
  • 然后在下拉列表中选择 "Python:选择解析器",这里会缓存一些已经创建好的解析器,
  • 如果没有想要的,可以选择 "Enter interpreter path" 来选择解析器路径,即已经创建好的虚拟环境脚本文件夹中的 Python 程序,就可以创建一个新的解析器

选择 Python 解析器

如果编辑的是 Python 代码文件,在状态栏中也可以选择和切换解释器,更为方便

Pycharm

创建项目时,在项目创建对话框中,可以创建或者选择已经已有的解析器

选择 Python 解析器

  • 选择创建新的解析器时,需要选择创建虚拟环境的工具,如 virtualenv;
  • 指定虚拟环境的目录;
  • 选择 Python 基础解析器,同 virtualenv 工具的 -p 参数的效果;
  • 是否要继承基础解析器的第三方库
  • 是否将这个虚拟环境作为默认环境,即创建其他项目时默认选择

如果选择已存在的解析器,和 VS Code 差不多,可以选择已经缓存的或者指定解析器的路径

部署虚拟环境

之所以在开发时选择虚拟环境,除了避免库之间的冲突,还有重要的原因是方便部署,因为虚拟环境是独立的,仅包含了项目相关的依赖库,所以部署的效率更高,风险更小

一般部署流程:

  1. 开发完成后,使用 pip freeze > requirements.txt 命令将项目的库依赖导出,作为代码的一部分
  2. 将代码上传到服务器
  3. 在服务器上创建一个虚拟环境
  4. 激活虚拟环境,执行 pip install -r requirements.txt,安装项目依赖

怎么运行项目,需要看项目的具体情况

Web 项目

一般使用 Django、Flask 的 Web 开发框架提供的项目,部署时需要一个 Web 容器,作为程序的运行环境,容器的配置中都有一个虚拟环境的设置,其实是指定 Python 解析器的路径,将其设置为虚拟环境的目录或者 Python 解析器就可以了,启动时就用使用虚拟环境,并与其他环境隔离。例如 uWSGI 配置文件中 home 参数是用来指定解析器的。

服务类项目

就是需要以服务的形式长时间运行的,例如定时爬虫之类的。

  • 对于 Linux 而言,当前主流的服务方式是 Systemd,是一种比 init 更先进的服务管理工具,在服务脚本中,设置 ExecStart 执行命令为全路径的虚拟环境的 Python 解析器,服务启动时使用独立的虚拟环境。
  • Windows 服务,对于达成 EXE 包的,不需要配置虚拟环境,因为打包时已经考虑了环境问题了,如果是脚本运行的话,需要指定全路径的 Python 解析器
单次运行项目

对于一些测试或者实验性质的项目,大多数情况下手动执行,只要在激活的虚拟环境下,或者用特定的 Python 解析器运行就好了,和在开发过程中运行区别不大

其他虚拟环境管理工具

  • virtualenvwrapper:是对 virtualenv 的一个封装,还有针对 vim 用户和 emacs 用户的扩展,能支持 bash/ksh/zsh
  • virtualenvwrapper-win:针对 Windows batch shell 的 virtualenvwrapper
  • pyenv:它可以安装、卸载、编译、管理多个 python 版本,并随时将其中一个设置为工作环境
  • pyenv-win:针对 Windows 的 pyenv

参考

zhuanlan.zhihu.com/p/216157886