Python大版本升级后自动重装包到虚拟环境
问题:Python大版本升级后自动重装包到虚拟环境
我的磁盘上有几个虚拟环境(数十个),由 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 -ring - if only 有可用于我的新操作系统的 Python 3.6 安装。
有没有其他方法可以以相当自动化的方式(可能主要是使用旧的lib/python3.6目录的pip freeze),而无需我从源代码安装 Python 3.6,使用 conda 或从一些随机 PPA 安装 3.6?我想整体升级所有环境,以便将来当我需要对随机环境做某事时,它将继续使用 Python 3.7。
解答
在您的新 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 之间的小版本中出现这种情况是非常罕见的,因此在实践中仅使用工作集应该“足够好”。
更多推荐

所有评论(0)