Python主版本升级后,自动将软件包重新安装到虚拟环境中

2024-09-17 07:37:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我的磁盘上有几个虚拟环境(几十个),它们是由Python3.6的venv模块创建的。现在我匆忙升级到了Ubuntu19.10,直到后来我才注意到,从公认的来源来看,Ubuntu19.10根本没有3.6版本。通过在我的主目录下定位bin/python3并在包含的文件夹上运行python3.7 -mvenv --upgrade,我成功地升级了这些虚拟环境的Python版本

现在,当python3.7 -mvenv --upgrade在虚拟环境中升级Python时,它不会在lib/python3.7/site-packages下的venv中重新安装我以前的包版本。我想我可以通过安装Python3.6来做到这一点,从venv中获取需求,然后将venv升级到Python3.7,pip install -ring-,如果我的新操作系统有Python3.6安装可用的话

有没有其他方法可以以相当自动化的方式(可能主要是pip freeze使用旧的lib/python3.6目录)实现这一点,而无需我从源代码安装Python 3.6、使用conda或从一些随机PPA安装3.6?我希望整体升级所有环境,以便将来当我需要使用随机环境时,它将继续使用Python 3.7


Tags: 模块pip定位版本bin环境venvlib
1条回答
网友
1楼 · 发布于 2024-09-17 07:37:00

在新的3.7版本中,您应该有pkg_resources可用-setuptools在创建时自动安装。如果没有,就pip install setuptools

setuptools库代码实际上是pip为了使pip freeze工作而提供的代码。但是你可以手动冻结它

# in 3.7 runtime...
import pkg_resources
old_site_dir = ".venv/lib/python3.6/site-packages/"
working_set = pkg_resources.WorkingSet([old_site_dir])
for dist in working_set:
    print(dist.as_requirement())

您可以将该输出抛出到requirements.txt文件中,并且可能有一个正在运行的重建站点,不需要python3.6运行时

请注意,此方法可能不是100%万无一失的,因为项目可以通过在python3.6和python3.7的分发元数据中使用环境标记来声明单独的依赖关系树(请参见PEP 508)。3.6站点中安装的项目也可能根本不支持3.7。然而,在3.6和3.7之间的小版本中,很少看到这种情况,因此在实践中仅使用工作集应该“足够好”

相关问题 更多 >