Pythoner 神器之 virtualenv

Foreword

实际 Python 学习、开发过程中,往往由于各种原因,多 Python 版本解释器环境 && 多版本的 Python 库(模块)需求是我们必然要面对的问题,这使得很多人在 Python 的环境管理上产生极大的混乱。甚至,不同的项目,或同一项目的不同阶段需要不同的 Python 解释器和依赖库。

那么,为每个 Python 项目,甚至每个脚本各自建立一套 “独立、隔离” 的 Python 环境(环境中可以自定义特定的 Python 版本以及特定的依赖库) 是必要的。

更多 Python 版本管理以及运行环境相关内容,请关注博主 Git 博文系列:

之一 >>> Python-Vers Management

之二 >>> Pythoner 神器之 virtualenv

之三 >>> 一文了解数据科学神器 Anaconda

之四 >>> Jupyter Tutorial


virtualenv

virtualenv 就是用来给每个 Python 项目,甚至每个脚本各自建立一套 “独立、隔离” 的 Python 运行环境的工具。

用 virtualenv 来保持一个干净、无污染的 Python 运行环境是非常有用的。

和主流的虚拟隔离环境工具类似,virtualenv 可以帮助你:

  • 可以创建任意多个虚拟环境(可以看作成一个个容器),使用时指定到(切换到)某一虚拟环境之后,通过 Pip 工具安装的包、库就只会在这个环境(容器)下;并且各虚拟环境(容器)之间,以及虚拟环境和系统原生环境之间是隔离的(一个个相互独立、隔离的容器)。
  • 假设某一个虚拟环境预计不再使用,可以直接删除掉相应虚拟环境,由于虚拟环境的独立、隔离性,不用关注文件残留、关联问题。

虚拟机制

virtualenv 管理的多版本 Python 运行环境示意图如下:

图解:

  • 每个 Python 解释器都有一个特定的指向自己的 pip 工具,两者一一对应;
  • 一个操作系统中,可以同时安装有多个不同版本的 Python 解释器(注意保证无冲突共存),你可以将其看作是 “操作系统级别” 的 Python 解释器;
  • virtualenv 可以将上述任一 “操作系统级别” 的 Python 解释器,虚拟成为一个 “虚拟级别” 的 Python 解释器,Python 版本取决于虚拟时所使用 “操作系统级别” 的 Python 解释器 版本;
  • 每个 “虚拟级别” 的 Python 解释器都拥有自己独立的 pip 工具和 site-package。

Setup

这一小节来看 virtualenv 在 Windows && Linux 平台下的安装方法。但前提是:

你的操作系统中必须已安装有一个 Python 环境。这是重要的,因为 virtualenv 的安装需要依赖于 Python 的包管理器——pip。

1 –> Begin to setup

Python 多版本共存环境下,建议直接使用操作系统下环境变量中指定的 Python 版本所绑定的 pip,安装命令如下:

1
pip install virtualenv

当然,你也可以选择操作系统中其它的 Python 版本所指向的 pip 进行安装,上面只是为了方便命令调用和管理。

看到如下安装信息,表示 virtualenv 成功安装:

1
2
3
...
Successfully installed virtualenv-20.4.4 appdirs-1.4.4 distlib-0.3.1 filelock-3.0.12 importlib-resources-3.2.1
...

你可以看到,除了安装 virtualenv 外,pip 还为我们安装了一些必须的依赖包。

2 –> Setup Test

安装成功之后,我们还可以进行 virtualenv 版本安装测试。成功安装的话,可以查看到版本信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
# Windows Info
XXX Guo@LAPTOP-SNOSCKOB MINGW64 ~/Desktop
$ pip -V
pip 9.0.3 from f:\python\python36\lib\site-packages (python 3.6)
XXX Guo@LAPTOP-SNOSCKOB MINGW64 ~/Desktop
$ virtualenv --version
virtualenv 20.4.4 from f:\python\python36\lib\site-packages\virtualenv\__init__.py

# Linux Info
root@iZ2zeazcdax8nlsrpzpd83Z:~# pip -V
pip 20.3.4 from /usr/local/lib/python3.5/dist-packages/pip (python 3.5)
root@iZ2zeazcdax8nlsrpzpd83Z:~# virtualenv --version
virtualenv 20.4.4 from /usr/local/lib/python3.5/dist-packages/virtualenv/__init__.py

可以看到, 不管是 Windows 平台使用的是 python3.6,还是 Linux 平台下使用的 python3.5,virtualenv 均被成功安装到 操作系统下环境变量中指定的有效 Python 版本库(site-package/dist-package)中。

这时,你就可以使用安装好的 virtualenv 虚拟你所需要的虚拟环境了~~~

| >>>> ================================= Split Line =============================== <<<< |

你或许有疑惑?设想若 Windows(Linux) 下还存在一个 Python2.7,那我要虚拟 Python2.7 版本的环境怎么办?在 2.7 下也装一个 virtualenv?

不需要的!virtualenv 可以指定虚拟的 Python 解释器版本,只要你本地操作系统的任一 Python 版本安装了 virtualenv 即可!

关于 virtualenv 可以指定创建虚拟环境的 Python 解释器版本,可见下文中使用,这里有这个概念即可。


Envs Management

这一小节来看,如何使用 virtualenv 进行虚拟隔离环境管理。

如何创建虚拟环境

这里将以 Windows 为例来看如何使用 virtualenv 来创建虚拟环境,Linux 平台下与 Windows 操作无异。

使用 virtualenv 来管理所有的虚拟隔离环境,通常会建立一个单独的目录(virtualenvs_py),用来放置 virtualenv 中管理的所有虚拟环境(你可以称之为:虚拟环境仓库):

1
mkdir E:\virtualenvs_py

然后,先来为深度学习项目创建一个名为 for_tensorflow 的 Python 运行环境,执行如下命令:

1
virtualenv -p F:\\Python\\Python36\\python.exe E:\\virtualenvs_py\\for_tensorflow

命令参数说明如下:

  • -p:指定你要虚拟的 “操作系统级别” 的 Python 解释器版本,这里选择了系统中的 Python3.6.5;
  • E:\virtualenvs_py\for_tensorflow:表示在 virtualenvs_py 目录下,建立一个名为 for_tensorflow 的虚拟环境,专门用于进行深度学习使用。

运行情况如下:

1
2
3
4
5
6
$ virtualenv -p F:\\Python\\Python36\\python.exe E:\\virtualenvs_py\\for_tensorflow    
created virtual environment CPython3.6.5.final.0-64 in 2759ms
creator CPython3Windows(dest=E:\virtualenvs_py\for_tensorflow, clear=False, no_vcs_ignore=False, global=False)
seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=C:\Users\XXX Guo\AppData\Local\pypa\virtualenv)
added seed packages: pip==21.0.1, setuptools==56.0.0, wheel==0.36.2
activators BashActivator,BatchActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator

找到 for_tensorflow 虚拟环境目录,你可以发现 virtualenv 帮助你创建了一个非常 “干净” 的 Python 运行环境!

|>>================== “干净”何解? ==================

virtualenv 的最新版本,以 20.0.0+ 为例,取消了 --no-site-packages 参数,默认已经使用了 –-no-site-packages 模式,表示 “虚拟级别” 的 Python 运行环境,不可以访问源 “操作系统级别” Python 解释器的第三方库

与之相对的,还有另外一个参数 --system-site-packages,表示 可以访问源 “操作系统级别” Python 解释器的第三方库。一般推荐直接使用默认模式。

最终命令格式如下:

1
virtualenv -p python_xxx envs_destination_dir

表示:使用 “操作系统级别” Python 解释器(python_xxx),来虚拟一个名为 “envs_destination” 的虚拟环境。并且,虚拟环境中不包含任何来源于 “python_xxx” 的第三方库(纯净)。

==============================================<<|

几种常见的创建虚拟环境的命令格式以及其含义:

1
2
3
4
5
6
7
8
9
# 1. 使用系统默认指定的 Python 解释器来创建虚拟环境 “env_py36”(不使用 "-p" 选项)
$ virtualenv env_py36

# 2. 多版本 Python 共存环境,创建指定 Python 版本的解释器虚拟环境
$ virtualenv -p F:\\Python\\Python27\\python.exe env_py27 # 解释器为 python2.7(Linux)
$ virtualenv -p python3.5 env_py35 # 解释器为 python3.5

# 3. 创建继承系统第三方库的虚拟环境
$ virtualenv --system-site-packages env_py34

如何激活虚拟环境

虚拟环境创建成功之后,不能立即使用!使用某一虚拟环境之前,你需要启动(激活)特定的虚拟环境之后,才可以使用。

1 –> For Windows

以 “for_tensorflow” 虚拟环境为例:

命令行下,进入你要使用的虚拟环境的目录下的 Script 文件夹,运行 activate 命令,或者使用绝对路径的方式调用该命令。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
E:\virtualenvs_py\for_tensorflow\Scripts>dir
E:\virtualenvs_py\for_tensorflow\Scripts 的目录

2021/04/30 21:16 <DIR> .
2021/04/30 21:16 <DIR> ..
2021/04/30 21:16 2,152 activate # 环境激活命令
2021/04/30 21:16 1,025 activate.bat
2021/04/30 21:16 3,075 activate.fish
2021/04/30 21:16 1,755 activate.ps1
2021/04/30 21:16 1,166 activate.xsh
2021/04/30 21:16 1,193 activate_this.py
2021/04/30 21:16 510 deactivate.bat
2021/04/30 21:16 106,362 pip-3.6.exe
2021/04/30 21:16 106,362 pip.exe
...
...
# 启动(激活)for_tensorflow 环境
E:\virtualenvs_py\for_tensorflow\Scripts>activate.bat
# 或者使用 `activate.bat` 的绝对路径

(for_tensorflow) E:\virtualenvs_py\for_tensorflow\Scripts>

注意命令提示符(for_tensorflow),它表示你当前处在 for_tensorflow 这个虚拟环境内,你可以认为你当前处于一个刚下载好的、纯净的、可以正常使用的 Python 环境。

当前环境下,1. 运行 Python 命令;2. 使用 pip 工具安装第三方库。这些操作都会被限制、绑定到 for_tensorflow 这个虚拟环境,不会对操作系统原生的 Python 环境和其它虚拟环境产生任何影响。

2 –> For Linux

对于 Linux 平台下,由于虚拟环境中的文件路径(activate)和脚本调用的方式(source)不同,激活虚拟环境和 Windows 有略微不同。

以 “env27” 虚拟环境为例:

Linux 中 activate 脚本位于 <env27\bin> 目录中,所以启动虚拟环境命令为:

1
2
# 激活虚拟环境:
$ source env27/bin/activate

这个命令会修改系统路径 $PATH,把 env27/bin 的路径置于系统路径之前。


如何退出虚拟环境

Windows && Linux 下,退出当前虚拟环境只需要执行如下命令,即可回退到系统原生的 Python 运行环境:

1
2
3
4
5
6
# 退出虚拟环境:
# For Windows:
> deactivate.bat

# For Linux:
$ deactivate

如何删除虚拟环境

当某一虚拟环境不再使用时,你可以将其删除释放系统资源。

Windows && Linux 下,删除虚拟环境(for_test)时,你只需要将 virtualenvs_py 目录下,准备弃用的 for_tensorflow 虚拟环境目录删除掉即可!


Application

这里给出一个 virtualenvs 虚拟环境管理器配合 pip 包管理工具,确保开发环境一致性的应用实例:

假设:在本地开发环境,已经准备好了 “项目 + 依赖包” 环境;。现在准备将项目上传至服务器,上线发布。那么,保证本地和服务器 Python 运行环境的一致性至关重要!

解决方案 –>

1 –> pip list

首先,我们需要使用 pip list 命令,来查看当前 Python 运行环境中项目依赖包的安装情况:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
(for_test1) E:\virtualenvs_py\for_test1>pip list
Package Version
------------------- ---------
appdirs 1.4.4
certifi 2020.12.5
chardet 4.0.0
distlib 0.3.1
filelock 3.0.12
idna 2.10
importlib-metadata 4.0.1
importlib-resources 5.1.2
numpy 1.19.5
pip 21.0.1
requests 2.25.1
setuptools 56.0.0
six 1.15.0
typing-extensions 3.7.4.3
urllib3 1.26.4
virtualenv 20.4.4
wheel 0.36.2
zipp 3.4.1
WARNING: The repository located at mirrors.aliyun.com is not a trusted or secure host and is being ignored. If this repository is available via HTTPS we recommend you use HTTPS instead, otherwise you may silence this warning and allow it anyway with '--trusted-host mirrors.aliyun.com'.

2 –> pip freeze

virtualenv 虚拟环境,配合 pip 的 freeze 功能,可以将当前虚拟环境中所有的依赖包以及其版本信息以列表的形式存放到文件中:

1
2
# 导出安装信息:
$ pip freeze > requirements.txt

3 –> pip install xxx

对应的,我们可以将上述生成的文件上传至服务器项目发布目录,然后在服务器下创建 virtualenv,即可使用下面的命令在 venv 中重新安装项目所需的模块依赖:

1
2
# 根据库文件安装依赖:
$ pip install -r requirements.txt

virtualenvwrapper

virtualenvwrapper 是一个基于 virtualenv 的升级版本。相较于 virtualenv,virtualenvwrapper 更容易对所有的虚拟环境进行统一管理。

Why virtualenvwrapper

参考上文,你可以发现 virtualenv 存在的一个最大缺点就是:

使用 virtualenv 创建虚拟环境时,如果你没有特别的,有意识的去统一管理虚拟环境目录,很容易导致虚拟环境放的到处都是。

其次,每次开启虚拟环境之前要去虚拟环境所在目录下的 bin(Scripts) 目录下 activate,这就需要我们记住每个虚拟环境所在的目录。并且还有可能你忘记了虚拟环境放在哪……

而使用 virtualenvwrapper 默认会将所有的虚拟环境都统一管理在一个目录下,你可以很方便、快捷的找到所有的虚拟环境。


How To Setup

我们同样需要使用 pip 工具来进行 virtualenvwrapper 的安装,并且 Windows && Linux 平台下的安装、配置过程稍有不同:

For Linux

1 –> Setup virtualenvwrapper

命令如下:

1
$ pip install virtualenvwrapper

Linux 中 virtualenvwrapper 默认将所有的虚拟环境放在 ~/.virtualenvs 目录下管理,另外可以通过修改环境变量 WORKON_HOME 来指定虚拟环境的保存目录。

1
2
# 为了保持和后文 Windows 保持一致,可以设置为统一目录:Envs
export WORKON_HOME=~/Envs

2 –> Config virtualenvwrapper

Linux 中,每次打开一个 Shell 想要使用 virtualenvwrapper 工具之前,都必须先激活 virtualenvwrapper 服务

1
2
3
root@iZ2zeazcdax8nlsrpzpd83Z:~# find / -name virtualenvwrapper.sh
/usr/local/bin/virtualenvwrapper.sh
root@iZ2zeazcdax8nlsrpzpd83Z:~# source /usr/local/bin/virtualenvwrapper.sh

这是麻烦的,可以将上述命令添加到:.bashrc || .profie 等 shell 启动文件中。以便 shell 登陆后可直接使用 virtualenvwrapper。

例如,在 .bashrc 中添加如下内容:

1
2
export WORKON_HOME=~/Envs  # 设置 virtualenv 的统一管理目录
source /usr/local/bin/virtualenvwrapper.sh # 激活 virtualenvwrapper 工具

读取文件,使得配置生效:

1
source ~/.bashrc

For Windows

Windows 安装命令如下:

1
pip install virtualenvwrapper-win

默认创建的虚拟环境管理目录位于 C:\Users\username\Envs,可以通过环境变量 WORKON_HOME 来定制:

通过计算机–>属性–>高级系统设置–>环境变量–>在系统变量中新建“变量名”:WORKON_HOME,变量值:“你自定义的路径”。


Envs Management

这一小节,我们来看:相较于 virtualenv 工具,virtualenvwrapper 是如何进行虚拟环境的统一管理。

Windows && Linux 下 virtualenvwrapper 虚拟环境管理命令是一致的!

如何创建虚拟环境

使用下列命令可以在 ~/Envs 目录创建 for_tensorflow 虚拟环境目录:

1
2
# 其中,`python_path` 为想要虚拟的系统级别的 Python 解释器路径
$ mkvirtualenv -p python_path for_tensorflow

创建后,自动进入到相应虚拟环境中。


如何激活&退出虚拟环境

使用下列命令可以激活 for_tensorflow 虚拟环境:

1
$ workon for_tensorflow

workon env_name:可以实现在虚拟环境中来回切换。

使用下列命令可以退出 for_tensorflow 虚拟环境:

1
$ deactivate

如何删除虚拟环境

使用下列命令可以删除 for_tensorflow 虚拟环境:

1
$ rmvirtualenv for_tensorflow

其它常用其他命令

lsvirtualenv
列举所有的环境(可以直接使用 workon + Enter 代替)。
cdvirtualenv
导航到当前激活的虚拟环境的目录中。
cdsitepackages
导航到当前激活的虚拟环境的目录中的 site-packages 目录中。
lssitepackages
显示 site-packages 目录中的内容。
virtualenvwrapper
显示帮助信息


但要注意的是,不管是使用 virtualenv 还是 virtualenvwrapper 虚拟环境工具,其都依赖于“操作系统级别” 的 Python 解释器。 也就是说,只有当前操作系统中包含目标版本的 Python 解释器,才可以虚拟相应目标版本的 Python 解释器,这是不合理的!!!

这时,你可以从系列博文关于 Anaconda 的介绍中需求解决方法 >>>> 【一文了解数据科学神器 Anaconda】。


Author

Waldeinsamkeit

Posted on

2018-01-02

Updated on

2023-03-30

Licensed under

You need to set install_url to use ShareThis. Please set it in _config.yml.

Comments

You forgot to set the shortname for Disqus. Please set it in _config.yml.