1.8 安装和使用 virtualenv
virtualenv是Python工具的一种变形。一旦开始使用这个工具,你就会义无反顾地爱上它。virtualenv会创建一个本地环境,并在这个环境下安装自带的Python版本。一旦从shell中激活这个环境,你就可以很方便地用pip install在本地安装包了。
首先,这听起来可能有点奇怪。为什么会有人希望这么做呢?因为这不仅可以帮助你处理涉及跨版本的Python包的依赖关系所带来的问题,而且还可以让你能够在不破坏其他重要环节的前提下快速地试验。假设你建立了一个网页应用,用的是包awesom_template的0.8版本,但是你的新数据产品需要这个包的1.2版本。在这种情况下你该怎么办呢?如果使用virtualenv,那么你可以二者都用。
另外一个例子是,如果你在某台机器上没有管理员权限,那么你该怎么办呢?你不能用sudo pip install来安装包,因而无法进行数据分析然而如果有virtualenv,则这些都不成问题。虚拟环境是软件开发者高效协同的开发工具。环境可以保证软件在不同的机器上以不同的依赖方式运行(比如生产或者开发服务器)。环境同时能够提醒其他开发者,这里有待开发的软件需求。
Python的virtualenv保证了软件是在整体环境中创建的,可以独立测试、协同部署。
1.8.1 准备工作
假设你已经完成了前面的步骤,那么现在你就已经准备好了。
1.8.2 操作流程
按照如下步骤,安装并测试虚拟环境。
1.打开一个shell命令行,输入命令pip install virtualenv或者sudo pipinstall virtualenv。
2.安装完成后,在命令窗口输入virtualenv,你将看到如下截屏中的内容。
3.创建一个临时路径,用如下命令转变当前路径:mkdir tempcd temp
4.在这个路径下,创建第一个虚拟环境,并命名为venv:virtualenv venv
5.你将看到类似如下的文字:
New python executable in venv/bin/python
Installing setuptools, pip...done.
6.现在,新的本地Python版本已经生成了。如果要用它,那么只需激活这个环境,使用如下代码:source ./venv/bin/activate
7.注意,活动的脚本无法直接执行,必须先用source命令激活。此外,注意你的shell命令提示符可能已经发生了变化,前缀已变成了venv
,这表明你现在正在虚拟环境下工作。
8.要想验证这一点,使用which命令来观察Python的位置:which python你将看到如下输出:/path/to/your/temp/venv/bin/python
9.输入如下命令进行安装:pip install flaskFlask是用Python写的一个微型网站框架。这个命令同时会安装很多Flask用到的包。
10.最后,我们验证一下虚拟环境和pip带来的版本控制的力量:pip freeze > requirements.txtcat requirements.txt
应该有如下输出结果:
Flask==0.10.1
Jinja2==2.7.2
MarkupSafe==0.19
Werkzeug==0.9.4
itsdangerous==0.23
wsgiref==0.1.2
11.请注意,不仅捕捉到了包名,包括包的版本号也捕捉到了。requirements.txt的优美之处在于,如果我们有了一个新的虚拟环境,那么只要简单地输入如下命令,就可以安装列出来的不同版本的Python包:pip install -r requirements.txt
12.如果要注销虚拟环境,则只需要输入命令:deactivate
1.8.3 工作原理
virtualenv生成自己的虚拟环境,有自己独立的安装路径,并且可以不依赖默认的操作系统环境进行独立的操作。如果你希望试验新的库,那么使用virtualenv就可以避免干扰系统层面的Python版本。更进一步,如果你有一个正在工作的应用,而且你希望它保持现状,那么也可以使用virtualenv让你的应用在它自己的virtualenv下运行。
1.8.4 更多内容
virtualenv是一个很不错的工具。对于任何一名Python程序员来说,它都是无价的。然而,我们还是要提醒诸位,为了提升程序性能,Python提供了很多工具来与C对象打通。因此,在你的虚拟环境下安装特定的Python包(比如NumPy和SciPy),需要安装和编译额外的依赖关系,这是由系统来指定的。比较顺利的时候,这些编译也是非常冗长的,这也是我们为什么要维护一个虚拟环境的原因之一。更糟糕的是,如果某些依赖没有安装,将导致编译失败,产生一些如同外星语言一般的报错信息,复杂的依赖链条会让你感到非常困扰。即便是有经验的数据科学家,也会对此头痛不已。一个简单的解决方案是,使用包管理器来把复杂的库安装到系统环境下。这些工具使用第三方包的预编译格式。如果你在系统环境安装了这些Python包,那么当你初始化virtualenv时,可以用--system-site-packages来做标记。这个标记告诉virtualenv使用系统已经安装的包,并且设法避免编译新增的安装包。要在你的环境下使用系统已经安装好的包(比如,当你希望使用一个包的新版本时),使用pit install -I,在虚拟环境下安装依赖关系到virtualenv,并且忽视全局的包。当你只需要在系统上安装大规模的包,同时使用virtualenv来进行其他类型的开发时,这种技术是比较有效的。
本书剩余的部分,我们将假设你已经安装以及本章提到的工具。我们不会太过强调或者纠结于虚拟环境的细节。你只要知道,虚拟环境是一个你可以单独执行本书中所有示例的安全环境。
内容来源:异步社区;版权属【人民邮电出版社 异步社区】所有,转载已获得授权;未经授权,不得以任何方式复制和传播本书内容,如需转载请联系异步社区。