我将系统上的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
。
答案 0 :(得分:1)
将virtualenv变为无法升级的情况似乎很容易。您可以手动修复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 freeze
到find_on_path
的代码跟踪: