Обновление 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?

9 ответов


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

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


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

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

python3 -m venv --upgrade ENV_DIR

снова обновили: Следующий метод может не работать в более новых версиях 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 core и стандартные библиотеки (плюс setuptools и pip) удаляются, а пользовательские библиотеки устанавливаются в site-packages сохраняются и работают, как только они находятся в чистом Python. Двоичные библиотеки могут или не могут быть переустановлены функционировать должным образом.

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

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

brew install gettext && brew link gettext --force

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

мой ~/.пип/пип.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-dir в моем pip.conf.

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


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

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

контекст:

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

маршрут:

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

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

$ deactivate
$ rmvirtualenv foo

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

2. Stash реальный проект в каталоге temp:

$ cd ..
$ mv foo foo-tmp

3. Создание новой виртуальной среды (и project dir) и активировать:

$ mkproject -p python3 foo

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

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

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

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

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


я переместил свой домашний каталог с одного mac на другой (Mountain Lion на Yosemite) и не знал о сломанном virtualenv, пока не потерял старый ноутбук. У меня была точка 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 поверх существующего каталога.


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


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

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

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

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

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