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


10

我的磁盘上有几个虚拟环境(数十个),它们是由venvPython 3.6模块制成的。现在,我匆忙升级到Ubuntu 19.10,直到后来才注意到,众所周知的来源对于Ubuntu 19.10根本不提供3.6。通过设法找到这些虚拟环境的Python版本,方法是位于bin/python3主目录下并python3.7 -mvenv --upgrade在包含的文件夹中运行。

现在,当python3.7 -mvenv --upgrade在虚拟环境中升级Python时,它并没有执行任何操作来在lib/python3.7/site-packages之下重新安装我以前的软件包版本venv。我想我可以通过安装Python 3.6,pip freeze从中获取要求venv,然后将venv升级到Python 3.7,pip install -r从而做到这一点- 如果只有适用于我的新OS的Python 3.6安装。

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

Answers:


11

在新的3.7 venv中,您应该有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之间颠簸的情况很少见,因此实际上使用工作集应该“足够好”。


在这种情况下,“ 足够好” 足够了。批量工作完成后,在这里和那里更新奇数模块没有问题。
Antti Haapala
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.