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

时间:2017-01-07 20:41:00

标签: python-venv

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

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

我已经尝试了python -m venv --upgrade命令,其中包含帮助文本“升级环境目录以使用此版本的Python,假设Python已就地升级。”。但是,这实际上并没有在virtualenv中重新安装软件包,它只是创建一个名为lib/python3.6/site-packages的基本空目录。此外,我必须删除venv中损坏的符号链接bin/python3.5,以便甚至针对旧的virtualenv运行python -m venv --upgrade

2 个答案:

答案 0 :(得分:1)

将virtualenv变为无法升级的情况似乎很容易。您可以手动修复venv,但我认为最简单的方法是重新开始。

简而言之:

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

请参阅此相关问题: Update a Python virtualenv?

答案 1 :(得分:1)

使用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的代码跟踪: