删除和/或更新系统的Python时虚拟环境的后果

Jos*_*ing 8 python upgrade python-venv virtual-environment

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

删除系统的Python安装(使用该源在系统上创建虚拟环境所使用的源)有什么后果venv

最终,我想做的是删除3.7安装并在发行3.8时安装3.8,但是我不确定虚拟环境与系统环境之间的连接强度。

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

  • 操作系统= Red Hat Enterprise Linux 7
  • 3.7是从Python.org上的源代码安装的,而不是rh-Pythonx.x yum存储库中的packge。
  • Python 3.7已安装到默认位置, /usr/local/bin/python3.7
  • /usr/local/bin/python3 是一个链接 /usr/local/bin/python3.7

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

虚拟环境内部是否有足够的空间成为自己稳定的3.7环境?还是会崩溃,尝试引用不再存在的系统安装?

tl; dr: 从不再存在的Python源创建的所有虚拟环境中发生了什么?

Sha*_*ger 7

坏消息:您正在使用venv,并且venv虚拟环境并非完全独立。即使使用创建--copies,它所复制的全部是python可执行文件本身,而不是标准库,甚至不是(如果您的安装创建的是共享库libpython而不是静态库)libpython;它依赖于系统副本。如果基于Python的安装消失了,虚拟环境将崩溃。如何它打破将有所不同基于它是如何创建的。例如,如果您使用以下方法创建它:

python3 -mvenv path/to/venv
Run Code Online (Sandbox Code Playgroud)

python3指的Python 3.7,然后更换python3与Python 3.8,那么你就可以解决了虚拟ENV的新版本:

python3 -mvenv --upgrade path/to/venv
Run Code Online (Sandbox Code Playgroud)

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

如果使用以下方法创建了虚拟环境:

python3.7 -mvenv path/to/venv
Run Code Online (Sandbox Code Playgroud)

那么它就完全坏掉了(至少如文档所述),只有在进行Python升级后,--upgrade开关才可以升级。由于不会命名新的Python python3.7,因此无法就地升级。就是说--upgrade,由于前面提到的次要版本lib/pythonX.Y目录,实际上只有在升级微型版本(从3.7.1到3.7.2或类似版本)时,它才能很好地工作,因此无论哪种方式,最好不要从以下版本创建新的虚拟环境刮。

需要明确的是,仅当系统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.7的情况下升级到3.8(您真的需要几十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
Run Code Online (Sandbox Code Playgroud)