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

Python主版本升级后,自动将软件包重新安装到虚拟环境中,python,python-3.x,python-venv,Python,Python 3.x,Python Venv,我的磁盘上有几个虚拟环境(几十个),它们是由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-

我的磁盘上有几个虚拟环境(几十个),它们是由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,
pip freeze
venv
下载需求,然后将venv升级到Python3.7,
pip install-r
ing来实现这一点,只要我的新操作系统上有Python3.6安装


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

在新的3.7版本中,您应该拥有可用的
pkg\u资源-
setuptools
在创建时自动安装。如果没有,只需
pip安装setuptools

setuptools
library代码实际上就是
pip
所销售的,以使
pip冻结
工作。但是你可以手动冻结它

# 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
runtime

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

在这种情况下,“足够好了”就足够了。批量工作完成后,在这里和那里更新奇数模块没有问题。