Обновление питона в виртуаленв

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

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

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

10 ответов

Решение

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

Если ваш virtualenv установлен с той же версией python, что и предыдущий, и обновление вашего пакета virtualenv не является вариантом, вы можете прочитать это, чтобы установить 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/).

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

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

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

python3 -m venv --upgrade ENV_DIR

Шаг 1. Заморозьте требование и сделайте резервную копию существующего env

pip freeze > requirements.txt
deactivate
mv env env_old

Шаг 2. Установите Python 3.7 и активируйте виртуальную среду.

sudo apt-get install python3.7-venv
python3.7 -m venv env
source env/bin/activate
python --version

Шаг 3. Установите требования

sudo apt-get install python3.7-dev
pip3 install -r requirements.txt

Обновление снова: следующий метод может не работать в более новых версиях 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.

Кстати, если ./manage.py compilemessages впоследствии не работает, попробуйте это:

brew install gettext && brew link gettext --force

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

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

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

  • Я работаю над некоторыми проектами Python 2, а некоторые - Python 3; в то время как я хотел бы использовать python3 -m venv, он не поддерживает среды Python 2
  • Когда я начинаю новый проект, я использую mkproject который создает виртуальную среду, создает пустой каталог проекта и компакт-диски в него
  • Я хочу продолжать использовать virtualenvwrapper's 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.

Будем считать, что среда, которую нужно обновить, имеет имя venv.

1. Резервное копирование требований venv (необязательно)

Прежде всего, сделайте резервную копию требований виртуальной среды:

pip freeze > requirements.txt
deactivate
#Move the folder to a new one
mv venv venv_old

2. Установите Python

Предполагая, что у кого-то нет доступа к sudo, pyenv это надежный и быстрый способ установки Python. Для этого нужно запустить

$ curl https://pyenv.run | bash

а потом

$ exec $SHELL

Как это предлагается здесь.

Если при попытке обновить pyenv

pyenv update

И возникает ошибка

bash: pyenv: command not found

Это потому, что путь pyenv не был экспортирован в.bashrc. Это можно решить, выполнив следующие команды:

echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init -)"\nfi' >> ~/.bashrc

Затем перезапустите оболочку

exec "$SHELL"

Теперь следует установить ту версию Python, которая вам нужна. Допустим, версия 3.8.3

pyenv install 3.8.3

Проверить, правильно ли он был установлен, можно, запустив

pyenv versions

На выходе должны быть расположение и версии (в данном случае 3.8.3).

3. Создайте новую виртуальную среду.

Наконец, с установленной новой версией Python создайте новую виртуальную среду (назовем ее venv)

python3.8 -m venv venv

Активировать это

source venv/bin/activate

и установите требования

pip install -r requirements.txt

Теперь нужно начать работу с новой средой.

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

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

malikarumi@Tetuoan2:~/Projects$ python3.6 -m venv {path to pre-existing dir you want venv in}

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

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

Мой ~/.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, Это сохраняет встроенные колеса в директории wheel в моем pip.conf.

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

У меня всегда работает такой подход:

# 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's it. Just repeat for each virtualenv located in ~/.virtualenvs

Взято из:

Если вы используете 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's 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
>>>

На 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 "{}" \;

ОБНОВЛЕНИЕ: хотя сначала казалось, что это работает хорошо, когда я запускал py.test, он выдавал ошибку. В конце концов я просто заново создал среду из файла требований.

Я переместил свой домашний каталог с одного компьютера на другой (Маунтин-Лев в Йосемити) и не понимал, что такое сломанный виртуал, пока не потерял старый ноутбук. У меня был пункт 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 поверх существующего каталога.

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

Ошибка: команда '['/Users/me/Sites/site/venv3/bin/python3', '-Im', ' surepip', '--upgrade', '--default-pip']' вернула ненулевое значение статус выхода 1.

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

 sudo apt-get install python3.6-venv
Другие вопросы по тегам