Обновление python в virtualenv

Есть ли способ обновить версию python, используемую в virtualenv (например, если выпущена версия исправления ошибок)?

Я мог бы pip freeze --local > requirements.txt, затем удалить каталог и pip install -r requirements.txt, но для этого требуется большая переустановка больших библиотек, например numpy, которые я использую много.

Я вижу, что это преимущество при обновлении, например, 2.6 → 2.7, но что же касается 2.7.x → 2.7.y?

Ответ 1

Вы видели этот? Если я не ошибаюсь в этом ответе, вы можете попытаться создать новый virtualenv поверх старого. Вам просто нужно знать, какой питон будет использовать ваш virtualenv (вам нужно будет увидеть свою версию virtualenv).

Если ваш virtualenv установлен с той же версией старой версии python, и обновление вашего пакета virtualenv не является вариантом, вы можете прочитать this, чтобы установите virtualenv с нужной версией python.

ИЗМЕНИТЬ

Я тестировал этот подход (тот, который создает новый virtualenv поверх старого), и он отлично работал у меня. Я думаю, что у вас могут возникнуть проблемы, если вы перейдете с python 2.6 на 2.7 или 2.7 на 3.x, но если вы просто обновляетесь внутри одной и той же версии (оставаясь в 2.7 по мере необходимости), у вас не должно быть никаких проблем, так как все пакеты хранятся в тех же папках для обеих версий python (пакеты 2.7.x и 2.7.y находятся внутри your_env/lib/python2.7/).

Если вы измените версию virtualenv python, вам нужно будет установить все свои пакеты снова для этой версии (или просто связать нужные вам пакеты в папке с пакетами новой версии, то есть: your_env/lib/python_newversion/site-packages)

Ответ 2

Если вы используете модуль venv, который поставляется с Python 3.3+, он поддерживает опцию --upgrade. На docs:

Обновите каталог среды, чтобы использовать эту версию Python, предполагая, что Python был обновлен на месте

python3 -m venv --upgrade ENV_DIR

Ответ 3

Обновлено снова: Следующий метод может не работать в более новых версиях virtualenv. Прежде чем пытаться внести изменения в старый virtualenv, вы должны сохранить зависимости в файле требований (pip freeze > requirements.txt) и сделать резервную копию в другом месте. Если что-то пойдет не так, вы все равно можете создать новый virtualenv и установить в нем старые зависимости (pip install -r requirements.txt).

Обновлено: Я изменил ответ через 5 месяцев после того, как я ответил. Следующий способ является более удобным и надежным.

Побочный эффект: он также исправляет исключение Symbol not found: _SSLv2_method, когда вы делаете import ssl в виртуальной среде после обновления Python до версии v2.7.8.

Примечание: В настоящее время это для Python 2.7.x только.


Если вы используете Homebrew Python на OS X, сначала deactivate все virtualenv, а затем обновите Python:

brew update && brew upgrade python

Выполните следующие команды (<EXISTING_ENV_PATH> - путь к вашей виртуальной среде):

cd <EXISTING_ENV_PATH>
rm .Python
rm bin/pip{,2,2.7}
rm bin/python{,2,2.7}
rm -r include/python2.7
rm lib/python2.7/*
rm -r lib/python2.7/distutils
rm lib/python2.7/site-packages/easy_install.*
rm -r lib/python2.7/site-packages/pip
rm -r lib/python2.7/site-packages/pip-*.dist-info
rm -r lib/python2.7/site-packages/setuptools
rm -r lib/python2.7/site-packages/setuptools-*.dist-info

Наконец, заново создайте свою виртуальную среду:

virtualenv <EXISTING_ENV_PATH>

При этом старые основные файлы Python и стандартные библиотеки (плюс setuptools и pip) удаляются, а пользовательские библиотеки, установленные в site-packages, сохраняются и работают, как только они находятся в чистом Python. Бинарные библиотеки могут быть или не нуждаться в переустановке для правильной работы.

Это работало для меня в 5 виртуальных средах с установленным Django.

BTW, если ./manage.py compilemessages не работает после этого, попробуйте следующее:

brew install gettext && brew link gettext --force

Ответ 4

Мне не удалось создать новый virtualenv поверх старого. Но есть инструменты в pip, которые делают его намного быстрее, чтобы переустановить требования в совершенно новый venv. Pip может построить каждый из элементов вашего требования .txt в пакет колес и сохранить его в локальном кеше. Когда вы создаете в нем новую вену и запускаете pip, pip автоматически использует предварительно построенные колеса, если найдет их. Колеса устанавливаются намного быстрее, чем запуск setup.py для каждого модуля.

My ~/.pip/pip.conf выглядит так:

[global]
download-cache = /Users/me/.pip/download-cache
find-links =
/Users/me/.pip/wheels/

[wheel]
wheel-dir = /Users/me/.pip/wheels

Установите колесо (pip install wheel), затем запустите pip wheel -r requirements.txt. Это сохраняет встроенные колеса в колесе-диске в моем pip.conf.

С тех пор, в любое время, когда я устанавливаю любые из этих требований, он устанавливает их с колес, что довольно быстро.

Ответ 5

Как обновить версию Python для существующего проекта virtualenvwrapper и сохранить то же имя

Я добавляю ответ для любого, кто использует Дуга Хеллмана отлично virtualenvwrapper, в частности, поскольку существующие ответы не сделали этого для меня.

Некоторый контекст:

  • Я работаю над некоторыми проектами Python 2, а некоторые - Python 3; хотя я бы хотел использовать python3 -m venv, он не поддерживает среды Python 2
  • Когда я запускаю новый проект, я использую mkproject, который создает виртуальную среду, создает пустой каталог проекта и вставляет в него компакт-диски
  • Я хочу продолжать использовать команду virtualenvwrapper workon для активации любого проекта независимо от версии Python

Направления:

Допустим, ваш существующий проект называется foo и в настоящее время работает на Python 2 (mkproject -p python2 foo), хотя команды одинаковы при обновлении с 2.x до 3.x, с 3.6.0 до 3.6.1 и т.д. я Я также предполагаю, что вы находитесь в активированной виртуальной среде.

1. Отключите и удалите старую виртуальную среду:

$ deactivate
$ rmvirtualenv foo

Обратите внимание, что если вы добавили какие-либо пользовательские команды в ловушки (например, bin/postactivate), вам необходимо сохранить их перед удалением среды.

2. Храните реальный проект во временном каталоге:

$ cd ..
$ mv foo foo-tmp

3. Создайте новую виртуальную среду (и каталог проекта) и активируйте:

$ mkproject -p python3 foo

4. Замените пустой сгенерированный каталог проекта реальным проектом, вернитесь обратно в каталог проекта:

$ cd ..
$ mv -f foo-tmp foo
$ cdproject

5. Переустановите зависимости, подтвердите новую версию Python и т. Д.:

$ pip install -r requirements.txt
$ python --version

Если это обычный случай использования, я рассмотрю возможность открытия PR, чтобы добавить что-то вроде $ upgradevirtualenv/$ upgradeproject в virtualenvwrapper.

Ответ 6

Я переместил свой домашний каталог с одного мака на другой (Mountain Lion to Yosemite) и не понял о сломанном виртуальном пространстве, пока не потерял старый ноутбук. У меня была точка virtualenv на Python 2.7, установленная brew, и поскольку Yosemite пришел с Python 2.7, я хотел обновить свой virtualenv до системного python. Когда я запускал virtualenv поверх существующего каталога, я получал ошибку OSError: [Errno 17] File exists: '/Users/hdara/bin/python2.7/lib/python2.7/config'. В результате проб и ошибок я работал над этой проблемой, удалив несколько ссылок и исправил еще несколько вручную. Это то, что я наконец сделал (похоже на то, что сделал @Rockalite, но проще):

cd <virtualenv-root>
rm lib/python2.7/config
rm lib/python2.7/lib-dynload
rm include/python2.7
rm .Python
cd lib/python2.7
gfind . -type l -xtype l | while read f; do ln -s -f /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/${f#./} $f; done

После этого я смог просто запустить virtualenv поверх существующего каталога.

Ответ 7

Я просто хочу уточнить, потому что некоторые ответы относятся к venv, а другие - к virtualenv.

Использование флага -p или --python поддерживается в virtualenv, но не в venv. Если у вас более одной версии Python и вы хотите указать, с какой из них создать venv, сделайте это в командной строке, например:

[email protected]:~/Projects$ python3.6 -m venv {path to pre-existing dir you want venv in}

Конечно, вы можете обновить с помощью venv, как уже отмечали другие, но это предполагает, что вы уже обновили Python, который использовался для создания этого venv. Вы не можете перейти на версию Python, которой у вас еще нет в вашей системе, поэтому сначала убедитесь, что вы получили нужную версию, а затем сделайте из нее все необходимые версии.

Ответ 8

В OS X или macOS с использованием Homebrew для установки и обновления Python3 мне пришлось удалить символические ссылки до того, как python -m venv --upgrade ENV_DIR будет работать.

Я сохранил следующее в upgrade_python3.sh, поэтому я бы вспомнил, как через несколько месяцев, когда мне нужно сделать это снова:

brew upgrade python3
find ~/.virtualenvs/ -type l -delete
find ~/.virtualenvs/ -type d -mindepth 1 -maxdepth 1 -exec python3 -m venv --upgrade "{}" \;

UPDATE: в то время как это, казалось, работало хорошо сначала, когда я побежал py.test, он дал ошибку. В итоге я только что создал среду из файла требований.

Ответ 9

Если вы используете pipenv, я не знаю, возможно ли обновить среду на месте, но, по крайней мере, для незначительных обновлений версий она кажется достаточно умной, чтобы не перестраивать пакеты с нуля, когда она создает новую среду. Например, с 3.6.4 до 3.6.5:

$ pipenv --python 3.6.5 install
Virtualenv already exists!
Removing existing virtualenv…
Creating a v$ pipenv --python 3.6.5 install
Virtualenv already exists!
Removing existing virtualenv…
Creating a virtualenv for this project…
Using /usr/local/bin/python3.6m (3.6.5) to create virtualenv…
⠋Running virtualenv with interpreter /usr/local/bin/python3.6m
Using base prefix '/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6'
New python executable in /Users/dmoles/.local/share/virtualenvs/autoscale-aBUhewiD/bin/python3.6
Also creating executable in /Users/dmoles/.local/share/virtualenvs/autoscale-aBUhewiD/bin/python
Installing setuptools, pip, wheel...done.

Virtualenv location: /Users/dmoles/.local/share/virtualenvs/autoscale-aBUhewiD
Installing dependencies from Pipfile.lock (84dd0e)…
  🐍   ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 47/47 — 00:00:24
To activate this project virtualenv, run the following:
 $ pipenv shell
$ pipenv shell
Spawning environment shell (/bin/bash). Use 'exit' to leave.
. /Users/dmoles/.local/share/virtualenvs/autoscale-aBUhewiD/bin/activate
bash-3.2$ . /Users/dmoles/.local/share/virtualenvs/autoscale-aBUhewiD/bin/activate
(autoscale-aBUhewiD) bash-3.2$ python
Python 3.6.5 (default, Mar 30 2018, 06:41:53) 
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>>

Ответ 10

Для всех с проблемой

Error: Command '['/Users/me/Sites/site/venv3/bin/python3', '-Im', 'ensurepip', '--upgrade', '--default-pip']' returned non-zero exit status 1.

Вы должны установить python3.6-venv

 sudo apt-get install python3.6-venv

Ответ 11

Этот подход всегда работает для меня:

# First of all, delete all broken links. Replace  my_project_name' to your virtual env name
find ~/.virtualenvs/my_project_name/ -type l -delete
# Then create new links to the current Python version
virtualenv ~/.virtualenvs/my_project_name/
# It it. Just repeat for each virtualenv located in ~/.virtualenvs

Взято из:

Ответ 12

Если в вашей системе есть virtualenv, вы можете просто сделать это:

virtualenv -p <python_executable_path/python.exe> <new_virtual_env_name>

Для пользователей Windows это будет выглядеть примерно так:

virtualenv -p C:\Users\yourUserName\AppData\Local\Programs\Python\Python36\python.exe myProject