我的磁盘上有几个虚拟环境(数十个),它们是由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中工作。
答案 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之间变化的情况很少见,因此实际上使用工作集应该“足够好”。