10

编辑清楚:这个问题是关于venv的,它经常与virtualenv混淆。

删除系统的 Python 安装会产生什么后果,该安装是用于在系统上创建虚拟环境的源venv

最终,我要做的是删除 3.7 安装并在 3.8 发布时安装它,但我不确定虚拟环境与系统环境的绑定程度。

询问此问题时可能相关的一些系统详细信息:

  • 操作系统 = 红帽企业 Linux 7
  • 3.7 从 Python.org 的源代码安装,而不是rh-Pythonx.xyum 存储库中的包。
  • Python 3.7 安装到默认位置,/usr/local/bin/python3.7
  • /usr/local/bin/python3是一个链接/usr/local/bin/python3.7

鉴于上述细节,我的印象是 Python 3.8 将安装到该版本/usr/local/bin/python3.8,然后python3将指向该版本。

虚拟环境中的内容是否足以成为其自身的稳定 3.7 环境?或者它会崩溃,试图引用一个不再存在的系统安装?

tl;dr: 所有那些从不再存在/被更新版本替换的 Python 源创建的虚拟环境会发生什么?

4

2 回答 2

9

坏消息:您正在使用venv,而venv虚拟环境并非完全独立。即使使用. --copies_ python_ 它依赖于系统副本。如果基于它的 Python 安装消失,虚拟环境将会中断。它的破坏方式将根据它的创建方式而有所不同。例如,如果您使用以下命令创建它:libpythonlibpython

python3 -mvenv path/to/venv

python3表示 Python 3.7,然后python3用 Python 3.8 替换时,您可以使用以下命令修复新版本的虚拟环境:

python3 -mvenv --upgrade path/to/venv

但是您安装的第三方软件包将(有效地)消失(它们将在 中path/to/venv/lib/python3.7,但 Python 3.8 只会在 中查找path/to/venv/lib/python3.8),因此您必须重新安装它们。

如果您使用以下命令创建了虚拟环境:

python3.7 -mvenv path/to/venv

然后它就完全坏了(至少如文档所述),仅当 Python 升级到位时,--upgrade开关才被记录为用于升级;由于新的 Python 不会被命名python3.7,因此您无法就地升级。也就是说--upgrade,由于前面提到的每个次要版本目录,实际上只有在升级微版本(从 3.7.1 到 3.7.2 等)时才能正常工作lib/pythonX.Y,所以无论哪种方式,你最好只创建一个新的虚拟环境刮。

需要明确的是,当且仅当系统 Python 安装静态链接时,第三方virtualenv没有此限制。奇怪的是,虽然该标志会使其复制主二进制文件和标准库模块,但它不会导致自身(解释器核心)被复制,因此如果主二进制文件依赖于 的系统副本,则删除系统副本打破虚拟环境。如果您确实使用并且您的可执行文件是静态链接的(应该显示没有依赖关系),那么是的,它会变得更加重量级(在 3.6 的本地测试中,通过适当的开关强制复制,新创建libpython--always-copylibpythonlibpython.so--always-copy pythonlibpython.aldd /path/to/python3libpythonvirtualenvvenv环境约为 11 MB,而virtualenv环境约为 48 MB;可悲的是,我的python动态链接libpython.so,所以它仍然无法工作)应该在删除系统安装的 Python 副本后仍然存在的虚拟环境。

无论如何,最好保留您的 Python 3.7 安装,然后升级到 3.8 而不要删除 3.7(您真的为几十 MB 的磁盘空间而努力吗?)。即使您替换python3为新的 3.8 安装,python3.7libpython3.7m.so.1.0类似的,3.7 标准库的其余部分仍将继续存在,以供虚拟环境依赖;在最坏的情况下,您可能需要手动更改虚拟环境中的符号链接以指向/path/to/python3.7而不是/path/to/python3继续使用旧版本(包括所有已安装的第三方软件包)。

尝试保持旧虚拟环境正常工作的另一种方法是备份该虚拟环境的已安装状态,删除它,安装新的 Python,创建一个新的虚拟环境,然后使用备份状态重新安装所有包在升级的虚拟环境中。一个例子可能是:

$ source ~/path/to/venv/bin/activate
$ pip freeze > installed_libs.txt
$ deactivate
$ rm -rf ~/path/to/venv
$ ... install new Python/remove old Python ...
$ python3 -mvenv ~/path/to/venv
$ pip install -r installed_libs.txt  # Optionally add --upgrade to install latest, not fixed versions
于 2019-03-06T16:13:59.287 回答
1

virtualenv包含 python 二进制文件本身的副本,因此不会发生任何事情。在此处查看更详细的说明

virtualenv 通过为每个程序创建一个完全隔离的虚拟环境来解决这个问题。环境只是一个目录,其中包含运行 Python 程序所需的所有内容的完整副本,包括 Python 二进制文件本身的副本、整个 Python 标准库的副本、pip 安装程序的副本以及(至关重要的)一个上面提到的站点包目录的副本。当您使用由 virtualenv 工具创建的 pip 副本从 PyPI 安装包时,它会将包安装到 virtualenv 目录内的 site-packages 目录中。然后,您可以像以前一样在程序中使用它。

编辑(考虑venv vs virtualenv):根据venv-documentation,它可以复制或符号链接二进制文件:

venv 模块支持使用自己的站点目录创建轻量级“虚拟环境”,可以选择与系统站点目录隔离。每个虚拟环境都有自己的 Python 二进制文件(与用于创建此环境的二进制文件的版本相匹配),并且可以在其站点目录中拥有自己独立的一组已安装的 Python 包。

于 2019-03-06T16:02:51.183 回答