Python小版本升级后,自动重新安装虚拟环境中的包。

11

我的电脑上有几十个由Python 3.6的venv模块创建的虚拟环境。现在我匆忙升级到Ubuntu 19.10,之后才发现从公认来源中根本没有提供3.6版本。我通过定位家目录下的bin/python3并在包含文件夹上运行python3.7 -mvenv --upgrade的方式成功升级了这些虚拟环境中的 Python 版本。

现在问题是,python3.7 -mvenv --upgrade只升级了虚拟环境中的 Python 版本,而未重新安装之前在venv下面的lib/python3.7/site-packages目录中的软件包。我猜测我可以通过安装Python 3.6,从venvpip freeze出需求列表,再将 venv 升级到 Python 3.7 并使用 pip install -r重新安装,但如果我的新操作系统不支持Python 3.6,那该怎么办呢?

有没有其他比较自动化的方式来完成这个任务(也许主要是使用旧的lib/python3.6目录下的pip freeze),而不需要我安装源码中的Python 3.6,使用conda或从一些随机PPAs安装3.6?我想批量升级所有环境,以便将来当我需要在某个随机环境中进行操作时,它仍然可以与Python 3.7继续工作。

1个回答

12
在您的新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%可靠的,因为项目可以通过在其发行元数据中使用环境标记来声明Python 3.6和Python 3.7的单独依赖树(请参见PEP 508)。还有可能在您的3.6站点安装的项目根本不支持3.7 。然而,在3.6和3.7之间进行次要版本升级时很少看到这种情况,因此在实践中仅使用工作集应该已经足够了。


在这种情况下,“足够好”就足够了。在完成大量工作后,更新偶尔的模块没有问题。 - Antti Haapala -- Слава Україні

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接