0
点赞
收藏
分享

微信扫一扫

应用层 Python 环境隔离

现在许多操作系统都将 Python 作为标准组件。对于大多数 Linux 发行版和基于 Unix 的系统(如 FreeBSD、NetBSD、OpenBSD 或 OS X 系统)来说,要么默认安装了 Python, 要么系统软件包仓库中包含 Python。其中很多系统甚至将 Python 作为核心组件的一部分。 有些操作系统的安装程序是用 Python 编写的,例如 Ubuntu 系统的 Ubiquity、Red Hat Linux 和 Fedora 系统的 Anaconda。

基于这一事实,PyPI 上的许多包也可以用系统包管理工具(如 Debian 和 Ubuntu 的 apt-get、Red Hat Linux 的 rpm、Gentoo 的 emerge)作为本地包来管理。不过应该记住, 可用的库非常有限,大部分也比 PyPI 上的版本要旧。因此,PyPA(Python Packaging Authority,Python 包官方小组)推荐始终采用 pip 来获取最新版本的 Python 包。虽然从 CPython 2.7.9 版和 3.4 版开始,pip 已经成为一个独立的 Python 包,但每一个新版本都会 默认安装 pip。安装新 Python 包的方法就是这么简单,如下所示:

   pip install <package-name>

pip 功能十分强大,可以强制安装特定版本的 Python 包(语法为 pip install package-name==version),或升级到最新可用的版本(使用--upgrade 参数)。对于 本书中提到的大多数命令行工具来说,在命令后添加-h 或--help 参数并运行可以轻松获 得其完整的用法说明,但下面给出一个示例会话,展示其最常用的选项:

   $ pip show pip

   ---

   Metadata-Version: 2.0

   Name: pip

   Version: 7.1.2

   Summary: The PyPA recommended tool for installing Python packages.

   Home-page: https://pip.pypa.io/

   Author: The pip developers

   Author-email: python-virtualenv@groups.google.com

   License: MIT

   Location: /usr/lib/python2.7/site-packages

   Requires:

   $ pip install 'pip<7.0.0'

   Collecting pip<7.0.0

     Downloading pip-6.1.1-py2.py3-none-any.whl (1.1MB)

       100% |████████████████████████████████| 1.1MB 242kB/s

14 第1章 Python现状

    Installing collected packages: pip

     Found existing installation: pip 7.1.2

       Uninstalling pip-7.1.2:

         Successfully uninstalled pip-7.1.2

   Successfully installed pip-6.1.1

   You are using pip version 6.1.1, however version 7.1.2 is available.

   You should consider upgrading via the 'pip install --upgrade pip'

   command.

   $ pip install --upgrade pip

   You are using pip version 6.1.1, however version 7.1.2 is available.

   You should consider upgrading via the 'pip install --upgrade pip'

   command.

   Collecting pip

     Using cached pip-7.1.2-py2.py3-none-any.whl

   Installing collected packages: pip

     Found existing installation: pip 6.1.1

       Uninstalling pip-6.1.1:

         Successfully uninstalled pip-6.1.1

   Successfully installed pip-7.1.2

在某些情况下,可能默认pip不可用。从Python 3.4版和2.7.9版开始,总是可以使 用 ensurepip 模块来引导启动 pip,具体如下:

$ python -m ensurepip

Ignoring indexes: https://pypi.python.org/simple

Requirement already satisfied (use --upgrade to upgrade): setuptools in / usr/lib/python2.7/site-packages

Collecting pip

Installing collected packages: pip

Successfully installed pip-6.1.1

关于在旧版 Python 中如何安装 pip 的方法,访问项目的文档页面可获取最新信息。 1.8.1 为什么要隔离

pip 可用于安装系统级的 Python 包。在基于 Unix 的系统和 Linux 系统上,这么做需 要超级用户权限,所以实际的调用如下所示:

   sudo pip install <package-name>

注意,在 Windows 上并不需要这样做,因为没有默认安装 Python 解释器,Windows 上的 Python 通常由用户手动安装,无需超级用户权限。

无论如何,不推荐直接从 PyPI 安装系统级的 Python 包,也应尽量避免这一做法。前 面说 PyPA 推荐使用 pip,这似乎与前面的说法相矛盾,但其中是有很重要的原因。如前 所述,通过操作系统软件包仓库,Python 往往是许多软件包的重要组成部分,也可以提供 许多重要服务。系统发行版的维护者投入大量精力选择合适的软件包版本,以匹配各种包 依赖。通常来说,系统软件包仓库中的 Python 包都包含自定义补丁,或者使用较旧的版本, 只是为了保证与其他系统组件的兼容。利用 pip 将这些 Python 包强制更新至某一版本,打 破了向后兼容,也可能会破坏某些关键的系统服务。

即使在本地计算机上,为了方便开发而做这些事情也不是一个好的理由。那样胡乱使 用 pip 几乎总会引起麻烦,最终导致难以调试的问题。并不是说要严格禁止从 PyPI 全局 安装 Python 包,但这么做时一定要清楚地认识到相关风险。

幸运的是,这个问题有一个简单的解决方案,就是环境隔离。在不同的系统抽象层中 对 Python 运行环境进行隔离的工具有很多种。其主要作用是,将项目依赖与其他项目和/ 或系统服务需要的包进行隔离。这种方法的好处在于以下几个方面。

• 解决了这样的难题:“X 项目依赖于 1.x 版,但 Y 项目却需要 4.x 版”。开发人员可 以同时开发多个项目,这些项目的依赖不同,甚至可能相互冲突,但项目之间却不 会相互影响。

• 项目不再受限于系统发行版仓库中包的版本。

• 不会破坏依赖特定包版本的其他系统服务,因为新版软件包只存在于隔离环境

内部。

• 项目依赖的包列表可以轻松“锁定(frozen)”,复制起来也很容易。 隔离最简单也最轻便的方法就是使用应用层的虚拟环境。它们仅隔离 Python 解释器和

其中可用的 Python 包。其设置非常简单,通常也足以保证小项目和小软件包开发过程中的 隔离。

 不幸的是,在某些情况下,这种做法可能不足以保证充分的一致性和可重复性。对于

这种情况,系统级隔离是对工作流程很好的补充,本章后面也会介绍一些可用的方案。

举报

相关推荐

0 条评论