2017-01-07 5 views
0

Я обновил Python на своей системе с Python 3.5 до 3.6, и теперь все мои виртуальные виртуальные машины, созданные в Python 3.5, больше не пригодны для использования. Как я могу получить список пакетов, установленных в Python 3.5 virtualenv, когда у меня установлен только Python 3.6? Мне нужно настроить новый Python 3.6 virtualenv с теми же пакетами, что и в старом Python 3.5 virtualenv.Как обновить виртуальную среду от предыдущей версии Python?

Я знаю, что я могу заглянуть в каталог lib/python3.5/site-packages и сделать список вручную, но я бы предпочел автоматический способ работы, например. pip freeze против старой виртуальной среды. Я бы предпочел не переустанавливать старую версию Python.

Я пробовал команду python -m venv --upgrade, в которой есть текст справки «Обновите каталог окружения, чтобы использовать эту версию Python, предполагая, что Python был обновлен на месте». Однако это фактически не переустанавливает пакеты в virtualenv, а просто создает по существу пустой каталог с именем lib/python3.6/site-packages. Кроме того, мне пришлось удалить сломанную символическую ссылку bin/python3.5 в venv, чтобы даже запустить python -m venv --upgrade против старого virtualenv.

ответ

1

Кажется легко получить virtualenv в ситуации, когда он не будет обновляться. Вы, вероятно, можете исправить вень вручную, но я думаю, что это проще всего начать снова.

Вкратце:

  • Создать новую virtualenv
  • Скопируйте в него каталоги в вашем старом venv, которые не являются частью среды venv.
  • В старой среде: ls -1 lib/python3.5/site-packages > requirements.txt, затем очистить его вручную
  • В новой среде pip install -r requirements.txt

Смотрите этот родственный вопрос: Update a Python virtualenv?

0

Используйте pkg_resources.find_on_path(), чтобы найти пакеты, используя ту же логику как pip freeze. Это работает, даже когда virtualenv для более старой версии Python:

[email protected]:~/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:

Смежные вопросы