python创建虚拟环境

概念

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

构建虚拟环境

原理

主要是利用了操作系统中环境变量以及进程间环境隔离的特性。例如,操作系统中的环境变量可以为程序提供信息交换介质,进程可以共享操作系统中的环境变量,亦可以为进程指定环境变量。其中PATH为一个很重要的环境变量,用于为操作系统提供可执行文件的访问路径等等。

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

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

Python 虚拟环境

创建

virtualenv 工具

已淘汰,所以不考虑使用。

venv 模块

Python3.3 之后,可以用模块 venv 代替 virtualenv 工具,好处是不用单独安装,3.3 及之后的版本,都可以通过安装好的 Python 来创建虚拟环境:
python -m venv myvenv
可以在当前目录创建一个名为 myvenv 的虚拟环境

venv 常用参数

--without-pip: 不需要安装 pip,默认为安装
--clear:如果创建虚拟环境的目录已经有了其他虚拟环境,清楚重建
因为 venv 是依附于一个 Python 解析器创建的,所以不需要指定 Python 解释器版本。

激活

可以理解成将当前命令行环境中 PATH 变量的值替换掉。

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

激活后,可以在命令行中看到虚拟环境标记,如上图

打印 PATH,命令如下:

Linux 下:

echo $PATH

Windows 下

echo %PATH%

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

退出

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

退出虚拟环境相当于将 PATH 恢复成原来的

设置设置虚拟环境

在虚拟环境的根目录下,我们可以看到一个叫 pyvenv.cfg 的文件。用文本编辑器打开后可以看到这几行内容:

home = /Library/Frameworks/Python.framework/Versions/3.7/bin
include-system-site-packages = false
version = 3.7.0`

其中, home 指的是系统中 python 模块的安装位置。除非你自定义过了,不然这个默认值就是对的。

include-system-site-packages 这个参数可以设置是否开启“引用系统中的模块”的功能。如果开启了,那么当你就可以直接使用系统中已经装过的第三方模块。(但是你在虚拟环境下装的模块就不能被其他地方的程序使用)

Version 可以指定 Python 的版本,前提是你必须要安装这个版本。(比如你只装了 python3.6 ,那么你设置成 2.7 就会出错)

与vscode配合

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

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

部署虚拟环境

流程:

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

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

Web 项目 Web 项目一般使用 Django、Flask 的 Web 开发的提供 Web 服务的项目,部署时需要一个 Web 容器,作为程序的运行环境,容器的配置中都有一个虚拟环境的设置,其实是指定 Python 解析器的路径,将其设置为虚拟环境的目录或者 Python 解析器就可以了,启动时就用使用虚拟环境,并与其他环境隔离。例如 uWSGI 配置文件中 home 参数是用来指定解析器的。
服务类项目 服务类项目就是需要以服务的形式长时间运行的,例如之前介绍的 公交闹钟,或者一些定时爬虫之类的,对于 Linux 而言,当前主流的服务方式是 Systemd,是一种比 init 更先进的服务管理工具,在服务脚本中, 设置 ExecStart 执行命令为全路径的虚拟环境的 Python 解析器,服务启动时,使用独立的虚拟环境了。Windows 服务,对于达成 EXE 包的,不需要配置虚拟环境,因为打包时已经考虑了环境问题了,如果是脚本运行的话,需要指定全路径的 Python 解析器
单次运行项目 对于一些测试或者实验性质的项目,大多数情况下手动执行,只要在激活的虚拟环境下,或者用特定的 Python 解析器运行就好了,和在开发过程中运行区别不大。

参考:https://zhuanlan.zhihu.com/p/152350911

posted @ 2021-06-22 16:22  poowicat  阅读(2609)  评论(0编辑  收藏  举报