如何从以前的 Python 版本升级虚拟环境?

How to upgrade virtual environment from previous Python version?

我将系统上的 Python 从 Python 3.5 升级到 3.6,现在我在 Python 3.5 中创建的所有 virtualenvs 都不再可用。当我只安装了 Python 3.6 时,如何获取安装在 Python 3.5 virtualenv 中的软件包列表?我需要使用与旧 Python 3.5 virtualenv.

相同的软件包设置新的 Python 3.6 virtualenv

我知道我可以查看 lib/python3.5/site-packages 目录并手动创建列表,但我更喜欢 运行ning 的自动方式,例如pip freeze 针对旧的虚拟环境。我不想重新安装旧版本的 Python。

我试过 python -m venv --upgrade 命令,它有帮助文本 "Upgrade the environment directory to use this version of Python, assuming Python has been upgraded in-place."。然而,这实际上并没有在 virtualenv 中重新安装包,它只是创建了一个名为 lib/python3.6/site-packages 的基本为空的目录。此外,我不得不删除 venv 中损坏的符号链接 bin/python3.5,以便甚至 运行 python -m venv --upgrade 对抗旧的 virtualenv。

似乎很容易让 virtualenv 陷入无法升级的境地。您可能可以手动修复 venv,但我认为重新开始最简单。

简述:

  • 创建一个新的虚拟环境
  • 将旧 venv 中不属于 venv 环境的目录复制到其中。
  • 旧环境:ls -1 lib/python3.5/site-packages > requirements.txt,然后手工清理
  • 新环境pip install -r requirements.txt

查看这个相关问题: Update a Python virtualenv?

使用 pkg_resources.find_on_path() 使用与 pip freeze 相同的逻辑查找包。即使 virtualenv 适用于 Python:

的旧版本,这仍然有效
rav@novascotia:~/venvs$ python
Python 3.6.1 (default, Mar 27 2017, 00:27:06) 
[GCC 6.3.1 20170306] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pkg_resources
>>> entries = pkg_resources.find_on_path(None, './st-courses-3.5/lib/python3.5/site-packages')
>>> print('pip install \\n%s' % ' \\n'.join('%s==%s' % (o.project_name, o.version) for o in entries))
pip install \
websockets==3.2 \
webencodings==0.5 \
wcwidth==0.1.7 \
...

这是从 pip freezefind_on_path 的代码轨迹: