Обновление питона в virtualenv

206

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

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

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

Саймон Уолкер
источник
2
Хотя вы можете изменить некоторые пути и т. Д., Чтобы заставить его работать. Последнее, что вы хотите, - это немного отличающаяся от производства среда. Подумайте только ... если есть хоть одно различие между компиляцией разных версий, вы потеряете все сэкономленное время, отследив ошибку. Я просто нашел время, чтобы создать новый virtualenv и переустановить все.
Сэм Долан
@ Симон Уокер. Точно такая же проблема. Я должен обновить Python 3.5.3 для исправления ошибки.
Мохаммед Шариф С

Ответы:

77

Вы видели это ? Если я не понял этого ответа неправильно, вы можете попытаться создать новый 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)

marianobianchi
источник
13
Он специально не хотел переустанавливать какие-либо пакеты, если это возможно. Очевидно, что вы никогда не устанавливали NumPy из источника, если вы не знаете, почему это важно;) Подсказка: это занимает ОЧЕНЬ много времени.
Антти Хаапала
да, я понимаю это Но, похоже, что если он сделает virtualenv поверх других, пакеты не будут потеряны, поэтому ему не придется переустанавливать numpy или любой другой пакет. Тем не менее, я думаю, что он должен попробовать это в новом virtualenv в случае неудачи.
Марианобианки
Я повторяю свое дело, я полагаю, что новые версии virtualenv действительно обновляются на месте, однако для старых версий они даже не перезаписывают исполняемый файл python, что вызывало проблемы как минимум с одним выпуском исправления Python.
Антти Хаапала
4
У меня это не сработало, и похоже, что это не так: github.com/pypa/virtualenv/issues/437
Кензо,
1
Я пытался создать новую virtualenvповерх старой, и сделал работу. Я должен был указать, -pчтобы указать на правильную версию Python.
OSA
76

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

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

python3 -m venv --upgrade ENV_DIR
CoupleWavyLines
источник
1
К сожалению, это не работает в Ubuntu 16.04, где они сломались venvи отказались исправить это на том основании, что «вы можете просто использовать virtualenv». РЕДАКТИРОВАТЬ: на самом деле, это работает! Он также показывает сообщение об ошибке «surepip».
rspeer
2
Я обновил python с 3.5.1 до 3.6.4 в моей системе. И чтобы обновить python на моем virtualenv, я должен был явно упомянуть python3.6 в команде:python3.6 -m venv --upgrade <path_of_existing_env>
Sarfraaz Ahmed
1
В моем случае bin/pythonи bin/python3до сих пор связаны старые python3.4двоичные файлы, и мне пришлось устанавливать ссылки вручную. Кроме того, есть ли способ удалить устаревшую версию Python?
Дженс
4
Я понял Error: Command '['/Users/me/Sites/site/venv3/bin/python3', '-Im', 'ensurepip', '--upgrade', '--default-pip']' returned non-zero exit status 1.> что это значит? Я не вижу активных процессов Python, не могу обновить.
user305883
1
@ user305883 Я получил похожую ошибку после того, как обновил системную версию Python с 3.5 до 3.6 (и удалил 3.5). Мне пришлось переустановить 3.5 и запустить python3.6 -m venv --upgrade ENV_DIRдля его работы. Я думаю, что мне все еще придется обновить некоторые символические ссылки в ENV_DIR/bin. Следовательно, хитрость заключалась в том, чтобы обновить новую версию Python, пока старая версия все еще была установлена.
AstroFloyd
24

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

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

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

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


Если вы используете 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
Rockallite
источник
Единственный файл, который мне пришлось удалить - это bin/pythonфайл.
Коен.
Для некоторых старых версий Python удаление необходимо setuptoolsи pipнеобходимо.
Rockallite
1
Я также должен был удалить, <EXISTING_ENV_PATH>/.Pythonпоскольку это сломало создание virtualenv.
Киран Джонналагадда
2
На основании этого ответа я написал небольшой скрипт (с полной атрибуцией): burgundywall.com/post/update-all-python-virtual-environments
Kurt
На самом деле вы можете легко удалить виртуальную среду, запустив ее, rmvirtualenv <env_name>и удалит все выстроенные зависимости :) См. Больше на: virtualenvwrapper.readthedocs.io/en/latest/…
Ник Лукас,
7

Я не смог создать новый virtualenv поверх старого. Но в pip есть инструменты, которые позволяют намного быстрее переустанавливать требования в совершенно новую версию. Pip может встроить каждый из элементов вашего needs.txt в пакет wheel и сохранить его в локальном кэше. Когда вы создаете новый venv и запускаете в нем установку pip, 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.

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

Русь Иган
источник
1
Я думаю, что для большинства людей использование механизма пипса для выполнения работы имеет смысл, но для тех, кто настроил их virtualenv, постактивировать, предварительно активировать и т. Д., Это нежелательный вариант, поскольку все, что потеряно, должно быть считано вручную.
dpwrussell
6

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

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

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

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

Тейлор Эдмистон
источник
1
Да, пожалуйста. Я прошел через это на полпути и получил серьезные проблемы ... Проверка была бы хорошей, потому что первый шаг необратим после удаления (насколько мне известно)
Крис Фрисина
2

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

# 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

Взято из:

Антон Данильченко
источник
1

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

haridsv
источник
1

На 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, он выдал ошибку. В итоге я просто заново создал среду из файла требований.

Джефф К Джонсон
источник
py.testне работает, потому что ~ / .virtualenvs / myenv / bin / python3.7 не является символической ссылкой, поэтому не обновляется.
Эш Берлин-Тейлор
Ах, на самом деле, проблема в том, ~/.virtualenvs/myenv/.Pythonчто есть символическая ссылка.
Эш Берлин-Тейлор
1

Если вы используете 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
>>>
Дэвид Моулз
источник
здорово! Спасибо за этот драгоценный камень
Майур Патил
1

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

Использование флага -por --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, которой у вас еще нет в вашей системе, поэтому сначала убедитесь, что вы получили нужную версию, а затем сделайте из нее все необходимые версии.

Малик А. Руми
источник
1

Шаг 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
user3785966
источник
0

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

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

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

 sudo apt-get install python3.6-venv
JanL
источник