|
|
51CTO旗下网站
|
|
移动端

1.8.2 常用解决方案

《Python高级编程(第2版)》第1章Python现状,本章将会向读者介绍一下Python 3的当前现状,同时介绍Python的现代开发方法。本节为大家介绍常用解决方案。

作者:张亮/阿信 译来源:人民邮电出版社|2018-01-29 17:55

1.8.2 常用解决方案

在运行时隔离Python的方法有几种。最简单也最显而易见的方法,就是手动修改PATH和PYTHONPATH环境变量或将Python二进制文件移动到其他位置,以改变它发现可用Python包的方式,将环境变量修改成保存项目依赖的自定义位置,当然这种方法也最难维护。幸运的是,有几种工具可以帮助维护虚拟环境,并维护系统中安装包的存储方式。这些工具主要包括:virtualenv、venv和buildout。它们在底层做的事情实际上与我们手动做的一样。实际的策略取决于具体的工具实现。但一般来说,它们更方便使用,而且还有其他好处。

1.virtualenv

在这个工具列表中,virtualenv是目前最常用的工具。它名字的含义就是虚拟环境(virtual environment)。它并不是Python标准发行版的一部分,所以需要用pip来获取。它也是值得在系统层面安装的Python包之一(在Linux系统和基于Unix的系统中要用到sudo)。

安装完成后,利用下面的命令可以创建一个新的虚拟环境:

  1. virtualenv ENV 

这里的ENV应替换为新环境的名字。这将在当前工作目录路径中创建一个新的ENV目录。里面包含以下几个新目录。

bin/:里面包含新的Python可执行文件和其他包提供的脚本/可执行文件。

lib/和include/:这些目录包含虚拟环境中新Python的支持库文件。新的Python包将会安装在ENV/lib/pythonX.Y/site-packages/中。

创建好新环境后,需要用Unix的source命令在当前shell会话中激活它:

  1. source ENV/bin/activate 

这将会影响环境变量,从而改变当前shell会话的状态。为了告知用户已经激活了虚拟环境,shell提示符会在开头增加(ENV)字符串。下面举个例子,在会话中创建一个新环境并激活:

  1. $ virtualenv example  
  2. New python executable in example/bin/python  
  3. Installing setuptools, pip, wheel...done.  
  4. $ source example/bin/activate  
  5. (example)$ deactivate  

关于virtualenv要注意,最重要的是它完全依赖于在文件系统中的存储状态。它不会提供额外功能来跟踪应该安装哪些包。这些虚拟环境不可移植,不能移动到其他系统或机器。对每个新的应用部署来说,都需要从头开始创建新的虚拟环境。因此,virtualenv用户有一个良好实践,就是将所有项目依赖保存到一个requirements.txt文件(约定命名)中,正如下面的代码所示:

  1. # 井号(#)后面的内容是注释。  
  2.  
  3. # 明确版本号,可重复性高。  
  4. eventlet==0.17.4  
  5. graceful==0.1.1  
  6.  
  7. # 如果项目在不同依赖版本中都通过测试,  
  8. # 也可以指定相对版本编号。  
  9. falcon>=0.3.0,<0.5.0 
  10.  
  11. # 应尽量明确Python包的版本,  
  12. # 除非始终需要最新版。  
  13. pytz 

有了这个文件,用pip就可以轻松安装所有依赖,因为它可以接受需求文件作为参数:

  1. pip install -r requirements.txt 

需要记住,需求文件并不总是理想的解决方案,因为它没有给定依赖的准确列表,而只给出了需要安装的依赖。因此,如果需求文件并非最新版,无法反映环境的实际状态,那么整个项目在开发环境中可以正常运行,但在其他环境中却无法启动。当然,pip freeze命令可以打印出当前环境所有的Python包,但不应该盲目使用这个命令。它会打印出所有内容,甚至那些仅用于测试而并不用于项目的Python包。本书提到的另一款工具buildout就解决了这个问题,所以可能是某些开发团队的更佳选择。

对于Windows用户来说,Windows下的virtualenv对内部目录结构使用了一种不同的命名方式。你要用Scripts/、Libs/和Include/3个目录,而不是bin/、lib/和include/,以更好地匹配这种操作系统上的开发约定。用于激活/关闭环境的命令也不一样。你要用ENV/Scripts/activate.bat和ENV/Scripts/deactivate.bat,而不是将source命令作用在activate和deactivate脚本上。

2.venv

虚拟环境很快逐步完善,成为了社区中的常用工具。从Python 3.3开始,标准库已经支持创建虚拟环境。其用法与Virtualenv几乎相同,虽然命令行选项采用了不同的命名约定。新的venv模块提供了pyvenv脚本,可以用于创建新的虚拟环境:

pyvenv ENV这里的ENV应替换为新环境的名字。此外,现在也可以用Python代码直接创建新的环境,因为所有功能都包含在内置的venv模块中。其他用法和实现细节(例如环境目录的结构、激活/关闭脚本)与Virtualenv几乎完全相同,所以换用这种方法应该很简单,也不会牵扯太多精力。

对于使用较新版本Python的开发人员来说,推荐使用venv而不是Virtualenv。对于Python 3.3版,切换到venv可能需要付出更多的精力,因为这一版本在新环境中没有默认安装setuptools和pip,所以用户需要手动安装它们。幸运的是,这一点在Python 3.4中已经修改,并且由于venv的可定制性,其内容可以被改写。对于细节的解释可参见Python文档,但有些用户可能会认为它过于复杂,仍然在这一版本的Python中继续使用Virtualenv。

3.buildout

buildout是一个强大工具,可与引导启动并部署用Python编写的应用。它的一些高级特性将在本书后面讲到。在很长一段时间内,他还被用作创建Python隔离环境的工具。由于buildout需要声明性的配置,每次依赖发生变化都必须修改配置,因此这些环境更容易复制和管理,无需依赖环境状态。

不幸的是,这一情况已发生变化。从2.0.0版开始,buildout包不再提供与系统Python在任何层级的隔离。处理隔离的任务留给其他工具来做,如virtualenv,所以仍然可以用buildout来做隔离,但事情变得有点复杂。buildout必须要在隔离环境中初始化才能真正隔离。

与之前版本的buildout相比,这一版本有一个主要缺点,就是它要依赖其他隔离方法。开发这些代码的开发人员不再确定对依赖的描述是否完整,因为有些Python包可以绕过声明性配置来安装。当然,这个问题可以通过适当的测试和发布过程来解决,但却使整个工作流程更加复杂。

总而言之,buildout不再是提供环境隔离的解决方案,但其声明性配置可以提高虚拟环境的可维护性和可重复性。

喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

软件设计师考试全真模拟试题及解析

本书是按照全国计算机技术与软件专业技术资格(水平)考试《软件设计师考试大纲》的要求,参照《软件设计师教程》及近年来考试试题编写的,...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊