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 | ... |
你可以看到,除了安装 virtualenv 外,pip 还为我们安装了一些必须的依赖包。
2 –> Setup Test
安装成功之后,我们还可以进行 virtualenv 版本安装测试。成功安装的话,可以查看到版本信息:
1 | Windows Info |
可以看到, 不管是 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 | virtualenv -p F:\\Python\\Python36\\python.exe E:\\virtualenvs_py\\for_tensorflow |
找到 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 | 1. 使用系统默认指定的 Python 解释器来创建虚拟环境 “env_py36”(不使用 "-p" 选项) |
如何激活虚拟环境
虚拟环境创建成功之后,不能立即使用!使用某一虚拟环境之前,你需要启动(激活)特定的虚拟环境之后,才可以使用。
1 –> For Windows
以 “for_tensorflow” 虚拟环境为例:
命令行下,进入你要使用的虚拟环境的目录下的 Script
文件夹,运行 activate
命令,或者使用绝对路径的方式调用该命令。
1 | E:\virtualenvs_py\for_tensorflow\Scripts>dir |
注意命令提示符(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 | 激活虚拟环境: |
这个命令会修改系统路径 $PATH,把 env27/bin 的路径置于系统路径之前。
如何退出虚拟环境
Windows && Linux 下,退出当前虚拟环境只需要执行如下命令,即可回退到系统原生的 Python 运行环境:
1 | 退出虚拟环境: |
如何删除虚拟环境
当某一虚拟环境不再使用时,你可以将其删除释放系统资源。
Windows && Linux 下,删除虚拟环境(for_test)时,你只需要将 virtualenvs_py
目录下,准备弃用的 for_tensorflow
虚拟环境目录删除掉即可!
Application
这里给出一个 virtualenvs
虚拟环境管理器配合 pip
包管理工具,确保开发环境一致性的应用实例:
假设:在本地开发环境,已经准备好了 “项目 + 依赖包” 环境;。现在准备将项目上传至服务器,上线发布。那么,保证本地和服务器 Python 运行环境的一致性至关重要!
解决方案 –>
1 –> pip list
首先,我们需要使用 pip list
命令,来查看当前 Python 运行环境中项目依赖包的安装情况:
1 | (for_test1) E:\virtualenvs_py\for_test1>pip list |
2 –> pip freeze
virtualenv 虚拟环境,配合 pip 的 freeze 功能,可以将当前虚拟环境中所有的依赖包以及其版本信息以列表的形式存放到文件中:
1 | 导出安装信息: |
3 –> pip install xxx
对应的,我们可以将上述生成的文件上传至服务器项目发布目录,然后在服务器下创建 virtualenv,即可使用下面的命令在 venv 中重新安装项目所需的模块依赖:
1 | 根据库文件安装依赖: |
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 | 为了保持和后文 Windows 保持一致,可以设置为统一目录:Envs |
2 –> Config virtualenvwrapper
Linux 中,每次打开一个 Shell 想要使用 virtualenvwrapper 工具之前,都必须先激活 virtualenvwrapper 服务
1 | root@iZ2zeazcdax8nlsrpzpd83Z:~# find / -name virtualenvwrapper.sh |
这是麻烦的,可以将上述命令添加到:.bashrc
|| .profie
等 shell 启动文件中。以便 shell 登陆后可直接使用 virtualenvwrapper。
例如,在 .bashrc
中添加如下内容:
1 | export WORKON_HOME=~/Envs # 设置 virtualenv 的统一管理目录 |
读取文件,使得配置生效:
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 | 其中,`python_path` 为想要虚拟的系统级别的 Python 解释器路径 |
创建后,自动进入到相应虚拟环境中。
如何激活&退出虚拟环境
使用下列命令可以激活 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】。
Pythoner 神器之 virtualenv
https://www.orangeshare.cn/2018/01/02/pythoner-shen-qi-zhi-virtualenv/
install_url
to use ShareThis. Please set it in _config.yml
.