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

时间:2020-01-22 11:47:09

标签: python python-3.x python-venv

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

现在,尽管python3.7 -mvenv --upgrade在虚拟环境中升级了Python,但它并没有执行任何操作以将我以前的软件包版本重新安装在lib/python3.7/site-packages下的venv中。我想我可以通过安装Python 3.6,从pip freeze venv满足要求,然后将venv升级到Python 3.7,pip install -r ing-(仅)来完成此操作为我的新操作系统安装了Python 3.6。

还有其他方法可以以相当自动化的方式(也许主要是使用旧的pip freeze的{​​{1}}来做到这一点,而不必从源码安装Python 3.6,使用conda或安装3.6)从一些随机的PPA?我想大规模升级所有环境,以便将来当我需要在随机环境中执行某些操作时,它将继续在Python 3.7中工作。

1 个答案:

答案 0 :(得分: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之间变化的情况很少见,因此实际上使用工作集应该“足够好”。