坏消息:您正在使用venv
,而venv
虚拟环境并非完全独立。即使使用. --copies
_ python
_ 它依赖于系统副本。如果基于它的 Python 安装消失,虚拟环境将会中断。它的破坏方式将根据它的创建方式而有所不同。例如,如果您使用以下命令创建它:libpython
libpython
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-copy
libpython
libpython.so
--always-copy
python
libpython.a
ldd /path/to/python3
libpython
virtualenv
venv
环境约为 11 MB,而virtualenv
环境约为 48 MB;可悲的是,我的python
动态链接libpython.so
,所以它仍然无法工作)应该在删除系统安装的 Python 副本后仍然存在的虚拟环境。
无论如何,最好保留您的 Python 3.7 安装,然后升级到 3.8 而不要删除 3.7(您真的为几十 MB 的磁盘空间而努力吗?)。即使您替换python3
为新的 3.8 安装,python3.7
或libpython3.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