Python虚拟隔离环境pyvenv、venv、virtualenv的来龙去脉

2011年6月13日,PEP 405 — Python Virtual Environments提案建议向 Python 添加一种机制,用于轻量级“虚拟环境”,具有自己的站点目录,可选择与系统站点目录隔离。每个虚拟环境都有自己的 Python 二进制文件(允许使用各种 Python 版本创建环境),并且可以在其站点目录中拥有自己独立的一组已安装的 Python 包,但与基本安装的 Python 共享标准库。

由于现有第三方虚拟环境工具(主要是 Ian Bicking 的virtualenv的流行,Python 虚拟环境的实用性已经得到很好的确立。虚拟环境已经广泛用于依赖项管理和隔离、无需系统管理员访问即可轻松安装和使用 Python 包,以及跨多个 Python 版本的 Python 软件自动测试等用途。

现有的虚拟环境工具缺乏 Python 本身行为的支持。诸如rvirtualenv 之类的工具不会将 Python 二进制文件复制到虚拟环境中,无法提供与系统站点目录的可靠隔离。Virtualenv支持了复制 Python 二进制文件,不过也被迫复制 Python 的大部分站点模块并手动符号链接/复制一组不断变化的标准库模块到虚拟环境中,以便在每次启动时执行微妙的引导。(Virtualenv 必须复制二进制文件以提供隔离,因为 Python 在搜索sys.prefix之前取消引用符号链接的可执行文件 。)

该PYTHONHOME环境变量,Python的唯一现存内置的虚拟环境解决方案,需要复制/符号链接整个标准库到每一个环境。复制整个标准库并不是一个轻量级的解决方案,对符号链接的跨平台支持仍然不一致(即使在支持它们的 Windows 平台上,创建它们通常需要管理员权限)。

与 Python 集成并借鉴现有第三方工具多年经验的虚拟环境机制可以减少维护,提高可靠性,并且更易于所有 Python 用户使用。virtualenv是一个创建隔离 Python 环境的工具。pyvenv 是 Python 3.3 和 3.4 中创建虚拟环境的工具,不过在 Python 3.6 中已弃用。Python 3.5版本开始推荐使用 venv 来创建虚拟环境。自 Python3.3 以来,virtualenv的一个子集已被集成到venv 模块下的标准库中。该 venv模块不提供该库的所有功能,仅举几个突出的例子:

  • 速度较慢(因为没有app-data种子方法)
  • 不那么可扩展
  • 无法为任意安装的python版本创建虚拟环境(并自动发现它们)
  • 无法通过pip升级
  • 没有那么丰富的编程API(描述虚拟环境而不创建它们)。

正在解决的基本问题是依赖项和版本之一,以及间接权限。假设您有一个需要版本1LibFoo应用程序,但另一个应用程序需要版本 2。你如何使用这两个库?如果您将所有内容都安装到您的主机 python(例如python3.8)中,很容易出现两个包有冲突需求的情况。

或者更一般地说,如果您想安装一个应用程序并保留它怎么办?如果应用程序正常工作,其库或这些库的版本中的任何更改都可能破坏应用程序。另外,如果site-packages由于没有更改主机python环境的权限而无法将软件包安装到全局目录中怎么办?

在所有这些情况下,virtualenv都可以帮助您。它创建了一个具有自己安装目录的环境,该环境不与其他 virtualenv 环境共享库(并且也可选择不访问全局安装的库)。

原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/experience/pythonops/2812.html

发表评论

登录后才能评论