Python虚拟环境venv模块

原文链接: Python 虚拟环境 看这一篇就够了

虚拟环境概述

Python应用程序通常会使用不在标准库内的软件包和模块。应用程序有时需要特定版本的库,修复特定的错误,或者可以使用库的过时版本的接口编写应用程序。

这说明一个Python安装可能无法满足每个应用程序的要求。例如:应用程序A需要特定模块的1.0版本但应用程序B需要2.0版本,则需求存在冲突,安装版本1.0或2.0将导致某一个应用程序无法运行。

这个问题的解决方案是创建一个虚拟环境,一个目录树,其中安装有特定Python版本,以及其他包。

不同的应用将可以使用不同的虚拟环境。就可以解决需求相冲突的例子。

基本概念

下面是一些基本概念:

  • PyPA:指 Python Packaging Authority,一个维护 Python 打包相关项目的小组,相关项目具体见 https://github.com/pypa
  • pip:Python 包安装器。
  • virtualenv:Python 虚拟环境管理工具。
  • venv:Python 标准库内置的虚拟环境管理工具,Python 3.3 加入,Python 3.5 开始作为管理虚拟环境的推荐工具,用法类似 virtualenv。如果你使用 Python 3,推荐使用 venv 来替代 virtualenv。

python 包管理器

软件包源中的软件包数量巨大,版本多样,所以需要借助于软件源管理工具,例如 pip、conda、Pipenv、Poetry 等

  • pip 是最常用的包管理工具,通过 pip install <packagename> 命令格式来安装软件包,使用的是 pypi 软件包源
  • conda 多用作科学计算领域的包管理工具,功能丰富且强大,使用的软件包源是 Anaconda repository 和 Anaconda Cloud,conda 不仅支持 Python 软件包,还可以安装 C、C++ 、R 以及其他语言的二定制软件包。除了软件包管理外,还能提供相互隔离的软件环境。
  • Pipenv 是 Kenneth Reitz 在2017年1月发布的Python依赖管理工具,现在由PyPA维护。Pipenv 会自动帮你管理虚拟环境和依赖文件,并且提供了一系列命令和选项来帮助你实现各种依赖和环境管理相关的操作
  • Poetry 和 Pipenv 类似,是一个 Python 虚拟环境和依赖管理工具,另外它还提供了包管理功能,比如打包和发布。你可以把它看做是 Pipenv 和 Flit 这些工具的超集。它可以让你用 Poetry 来同时管理 Python 库和 Python 程序

很多包管理工具不仅提供了基本的包管理功能,还提供了虚拟环境构建,程序管理的等功能

virtualenv 工具

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

1
pip install virtualenv

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

1
virtualenv --no-site-packages myvenv

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

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

  • -p: 用于指定 Python 解析器,就是安装好的 Python 应用程序,默认为当前环境中的 Python
  • –no-pip:不需要安装 pip,默认为安装
  • –clear:如果创建虚拟环境的目录已经有了其他虚拟环境,清楚重建
命令参数作用
workon列出当前系统中所有的虚拟环境
workon <虚拟环境名称>进入执行名称的虚拟环境中
mkvrualenv <虚拟环境名称>-p指定python解析器版
deactivate在虚拟环境内部退出环境
pip freeze列出当前环境下开发者使用pp安装的包列表,作用类似于。pip list,但是比pip list好用
pip freeze >requriments.txtrequriments.txt是瞎写备份虚拟环境中的所有依赖包列表
pip install r ./requriments.txt还原备份的虚拟环境包列表
rmvirtualenv <虚拟环境名称>删除指定名称的虚拟环境[慎更使用,删除前建议备份]

venv 模块

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

1
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 命令执行,例如

    1
    $ source myvenv/bin/activate

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

打印 PATH,命令如下:

Linux 下:

1
echo $PATH

Windows 下

1
echo %PATH%

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

退出

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

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

与开发工具配合

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

Visual Studio Code

VS Code 是个后起之秀,功能强大且具有丰富的插件资源,无疑是这两年发展最快的综合开发工具。现在的版本配置 Python 虚拟环境很简单,只需要选择一个 Python 解释器就好了

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

img

选择 Python 解析器

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

img

选择 Python 解析器

Pycharm

Pycharm 应该是功能最好的 Python 开发工具,转为 Python 开发而生,除了基本的开发功能外,还提供项目创建、打包、测试等丰富功能,有很大的市场占有率

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

img

选择 Python 解析器

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

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

部署虚拟环境

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

一般部署流程是:

  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 解析器运行就好了,和在开发过程中运行区别不大

其他虚拟环境管理工具

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

有兴趣的话可以试用一下

从其他工具迁移回来

如果你想从 Pipenv 迁移回来,方法很简单,只需要生成一个 requirements.txt 文件即可。使用下面的命令生成一般依赖列表:

1
$ pipenv lock -r

使用下面的命令输出开发依赖列表:

1
$ pipenv lock -r --dev

然后手动把两个命令的输出保存为 requirements.txt 和 requirements-dev.txt。

从 Poetry、Conda 等其他工具迁移回来可以使用 pipreqs 来生成 requirements.txt,它会基于项目代码的导入语句来生成依赖列表。

总结

今天主要了解了 Python 虚拟环境的相关概念和工具,并简单描述了实际工作中的一些使用方式,以便能在开发过程中使用。限于篇幅,没法就更多的内容详细展开,需要在实践中多试多用,Just DO It!

Anaconda

比如有两个项目,里边的模块版本基本一致,生成两套环境有点冗余,Anaconda就解决了这一问题

也是一个虚拟环境管理工具,anaconda在virtualenv 的基础上,提取了公共代码保存到一个公共目录,独立代码才会分离开来。

更多内容参考:知乎CSDN

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
## 查看当前Anaconda的系统配置信息
conda info
## 列出当前系统中所有虚拟环境,环境列表左边*号表示当前所在环境
conda env list # 也可以 conda info -e
## 新建虚拟环境
-n <虚拟环境名称> 或者 --name <虚拟环境名称>
conda create -n <虚拟环境名称> python=<python版本号> <包名1>=<版本号> <包名> ... <包名n>
## eg:
conda create -n python27 python=2.7
conda create -n python36 python=3.6 pymongo
conda create -n mofang python=3.8 flask celery
conda create -n renran python=3.6 django=3.2.10 pymysql

## 克隆虚拟环境
conda create -n <新的虚拟环境名称> --clone <旧的虚拟环境名称>

## 进入/切换 到指定名称的虚拟环境,如何不带任何参数,则默认回到全局环境base中。
conda activate <虚拟环境名称>

## 推出当前虚拟环境
conda deactivate

## 给指定的虚拟环境安装/更新一个或多个指定包
## 当然也可以进入虚拟环境以后,通过pip install <包名> 来完成工作
conda install -n <虚拟环境名称> <包名1>==<版本号> <包名2> ... <包名n>

## 给指定虚拟环境卸载一个或多个指定包
## 当然也可以进入虚拟环境以后,通过pip uninstall <包名> 来完成工作
conda remove -n <虚拟环境名称> <包名1>==<版本号> <包名2> ... <包名n>

## 删除指定虚拟环境
conda remove -n <虚拟环境名称> --all

## 导出当前虚拟环境的Anaconda包信息到环境配置文件environment.yaml中
## 当然也可以用pip freeze > requirments.txtrequirments.txt 安装到新的虚拟环境
conda env export > environment.yaml

## 根据环境配置文件environment.yaml的包信息来创建新的虚拟环境
## 当然也可以用pip install -r requirments.txt 安装到新的虚拟环境
conda env create -f environment.yaml

## 在指定目录下创建虚拟环境
conda create --prefix D:\django_test2 python=3.8
## 或者 conda create -p D:\django_test2 python=3.8
conda activate D:\django_test2 #切换并激活


## 查看conda版本
conda -V

## 更新Anaconda的版本,这里可以执行conda_update,系统会自动提示完整并正确的命令

报错原因:默认从国外镜像源下载,而从国外下载速度极慢,导致报错
解决办法:使用清华镜像,下面是添加清华镜像至Anaconda仓库的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
## 报错超时
Collecting package metadata (current_repodata.json): failed

CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://repo.anaconda.com/pkgs/main/win-64/current_repodata.json>
Elapsed: -

An HTTP error occurred when trying to retrieve this URL.
HTTP errors are often intermittent, and a simple retry will get you on your way.

If your current network has https://www.anaconda.com blocked, please file
a support request with your network engineering team.

'https://repo.anaconda.com/pkgs/main/win-64'+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
## 在自己的用户目录下`eg:C:\Users\User\.condarc`,修改配置为清华源并保存
channels:
- defaults
show_channel_urls: true
channel_alias: http://mirrors.tuna.tsinghua.edu.cn/anaconda
default_channels:
- http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
- http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
- http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
- http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/pro
- http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
custom_channels:
conda-forge: http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
msys2: http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
bioconda: http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
menpo: http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
pytorch: http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
simpleitk: http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud