Python 主要版本升级后自动将软件包重新安装到虚拟环境中
Reinstall packages automatically into virtual environment after Python major version upgrade
我的磁盘上有几个(几十个)虚拟环境,它们是由 Python 3.6 的 venv
模块创建的。现在我匆忙升级到 Ubuntu 19.10,后来才注意到 3.6 对于 Ubuntu 19.10 根本不可用,来自公认的来源。我已经通过在我的主目录下找到 bin/python3
和 运行 python3.7 -mvenv --upgrade
来升级这些虚拟环境的 Python 版本包含的文件夹。
现在,虽然 python3.7 -mvenv --upgrade
升级虚拟环境中的 Python,但它不会在 venv
下的 lib/python3.7/site-packages
中重新安装我以前的软件包版本。我想我可以通过安装 Python 3.6,pip freeze
ing venv
的要求,然后将 venv 升级到 Python 3.7,pip install -r
ing 来做到这一点- 如果 我的新 OS.
有 Python 3.6 安装可用
是否有任何其他方法以相当自动化的方式执行此操作(可能主要是 pip freeze
使用旧的 lib/python3.6
目录)而无需我从源代码安装 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 之间的次要版本中很少见,因此在实践中仅使用工作集应该是 "good enough"。
我的磁盘上有几个(几十个)虚拟环境,它们是由 Python 3.6 的 venv
模块创建的。现在我匆忙升级到 Ubuntu 19.10,后来才注意到 3.6 对于 Ubuntu 19.10 根本不可用,来自公认的来源。我已经通过在我的主目录下找到 bin/python3
和 运行 python3.7 -mvenv --upgrade
来升级这些虚拟环境的 Python 版本包含的文件夹。
现在,虽然 python3.7 -mvenv --upgrade
升级虚拟环境中的 Python,但它不会在 venv
下的 lib/python3.7/site-packages
中重新安装我以前的软件包版本。我想我可以通过安装 Python 3.6,pip freeze
ing venv
的要求,然后将 venv 升级到 Python 3.7,pip install -r
ing 来做到这一点- 如果 我的新 OS.
是否有任何其他方法以相当自动化的方式执行此操作(可能主要是 pip freeze
使用旧的 lib/python3.6
目录)而无需我从源代码安装 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 之间的次要版本中很少见,因此在实践中仅使用工作集应该是 "good enough"。