使用“-m venv --upgrade”在虚拟环境中升级Python版本。

4
我有多个由pyenv管理的Python版本。我想使用“--upgrade”选项将其中一个虚拟环境从3.7.13升级到3.10.3:
>deactivate 
>pyenv local 3.10.3 
>python3 -m venv --upgrade .venv 
>. .venv/bin/activate 
> python -V 
Python 3.7.13

我原本期望使用'--upgrade'会将Python版本升级到3.10.3,但实际上并未升级,而是仍然停留在3.7.13。

我知道重新创建虚拟环境可能更简单,但我真的想学习一下'--upgrade'应该如何使用。


我想告诉你,我已经使用全新的安装成功地重现了这种行为,所以不仅仅是你遇到了这个问题。 - user7661619
1个回答

3
如果你阅读了venv模块的官方文档,那么--upgrade选项的描述非常具体: "...假设已经在原地升级了Python。"我认为这意味着必须是与最初创建虚拟环境的Python安装相同的版本才能使--upgrade标志正常工作。由pyenv安装的每个Python版本都是单独安装的,因此我不指望在这种情况下--upgrade标志会起作用。
话虽如此,据我所知,venv除了安装一些基本脚本和配置文件,以及一些符号链接之外,几乎什么也没做。 venv模块的源代码看起来相当简单,--upgrade开关只是跳过设置脚本而已。我认为你可以通过更改一些符号链接和更改一些目录名称来手动"hack"它。然而,这不是应该使用venv的方式。
所以,对自己好一点,丢弃旧的虚拟环境,重新建立一个新的虚拟环境。

我终于明白了“假设Python已经就地升级”的含义,但这并不是大多数用户使用Python环境的方式。例如,我有两个本地目录,分别安装了Python 3.9和3.10,现在我创建了一个新目录,并安装了Python 3.11,我需要一个venv选项来使现有的Python 3.9环境指向Python 3.11。当然,我可以就地升级Python 3.9到Python 3.11,但你猜怎么着,安装Python 3.9的目录名为.localpython39,所以在其中安装Python 3.11会产生误导,并且我必须从头开始重新创建环境。 - mmj
@mmj实际上,我预计大多数人只有一个全局的Python安装程序,已经全局安装了软件包或是在使用venv创建的本地虚拟环境中安装的软件包。因此,当这些用户将其全局Python升级到新版本时,他们可以使用venv的--upgrade标志“修复”其旧虚拟环境。 - user7661619
@mmj 然而,pyenv 强制你以不同的方式工作。据我所知,pyenv 不支持传统意义上的将 Python 安装升级到新版本。相反,如果你想在 pyenv 中使用新版本,则必须为该新版本的 Python 创建一个新的独立安装,因为这个新安装与旧安装是分开的,所以 venv 的 --upgrade 标志不能按预期工作。 - user7661619
@mmj 另一个暗示是你可能无法做到你想做的事情,这与 pyenv 的 virtualenv 命令的工作方式有关。它为不同的 Python 版本创建单独的虚拟环境,而不是使用某些神奇的技巧来重用/升级相同的虚拟环境。 - user7661619
@mmj 可能可以手动升级pyenv的安装,或通过编辑虚拟环境中的文件指向不同的Python安装来欺骗venv,但这些选项似乎非常容易出错,并且可能会意外地损坏一些东西。我不建议尝试这样做。相反,请创建一个设置,以便您可以在切换到不同的Python版本后轻松地重新创建您的虚拟环境(例如使用requirements.txt文件),您将永远不必再担心此问题了。 - user7661619
确实,这就是我正在做的事情。使用定制版本的Python进行环境重建,具体命令为 ~/.local/python3X/bin/python3.X -m venv --clear <env-path>(该命令会删除环境内容),然后使用 pip install <space-reparated-list-of-core-packages> 重新安装所有包。(我停止使用 requirements.txt 是因为当一个软件包删除了一个依赖项时,你需要手动从 requirements.txt 中发现它并将其删除,否则你将继续安装未使用的依赖包。) - mmj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接