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

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

通过现有的第三方虚拟环境工具(主要是Ian Bicking的virtualenv)的普及,已经很好地建立了Python虚拟环境的实用程序。虚拟环境已被广泛用于依赖性管理和隔离,无需系统管理员即可轻松安装和使用Python软件包以及跨多个Python版本自动测试Python软件以及其他用途。

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

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

与Python集成的虚拟环境机制并借鉴了已有第三方工具的多年经验,可以降低维护成本,提高可靠性,并为所有Python用户提供更轻松的访问环境。从Python 3.3开始,virtualenv的子集被集成到了venv模块下的标准类库中,pyvenv 是 Python 3.3 和 3.4 中创建虚拟环境的推荐工具,不过在 Python 3.6 中已弃用。Python 3.5版本开始推荐使用 venv 来创建虚拟环境。venv并没有提供venv模块下的标准类库的所有功能,仅提供了几个突出的功能:

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

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

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

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

所以先有virtualenv,随着用的人越来越多,毕竟并没有得到Python官方的规范有力支持,后来有人提交了提案,于是virtualenv中的部分功能被添加到了Python官方vnev模块下的类库,pyvenv是venv的曾用名。venv相当于是个Python官方规范,但功能不是很全,而virtualenv是提供了规范的所有功能以及增强功能。目前virtualenv也是Python pypa组织的一员。

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

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注