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

Ant*_*ala 11 python python-3.x python-venv

我的磁盘上有几个虚拟环境(几十个),由venvPython 3.6 模块制作。现在我匆忙升级到 Ubuntu 19.10,后来才注意到 Ubuntu 19.10 根本不可用 3.6 从公认的来源。通过定位在我的主目录下并在包含的文件夹上运行,我设法升级了这些虚拟环境的Python 版本bin/python3python3.7 -mvenv --upgrade

现在,虽然python3.7 -mvenv --upgrade在虚拟环境中升级 Python,但lib/python3.7/site-packagesvenv. 我想我可以通过安装Python 3.6,已经这样做了pip freeze荷兰国际集团从需求venv,然后VENV升级到Python 3.7,pip install -r荷兰国际集团-只要有Python的3.6安装可用于我的新的操作系统。

有没有其他方法可以以相当自动化的方式(也许主要是pip freeze使用旧lib/python3.6目录)来做到这一点,而我不必从源代码安装 Python 3.6、使用 conda 或从一些随机 PPA 安装 3.6?我想整体升级所有环境,以便将来当我需要对随机环境执行某些操作时,它将继续使用 Python 3.7。

wim*_*wim 12

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

setuptools库代码实际上pip是vendoring 的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())
Run Code Online (Sandbox Code Playgroud)

您可以将该输出放入一个requirements.txt文件中,并且可能有一个工作的重建站点,不需要python3.6运行时。

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