Вопрос по python – Обновление питона в virtualenv

153

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

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

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

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

Ваш Ответ

10   ответов
47

который поставляется с Python 3.3+, он поддерживает--upgrade вариант. Подокументы:

Upgrade the environment directory to use this version of Python, assuming Python has been upgraded in-place

python3 -m venv --upgrade ENV_DIR
Error: User Rate Limit Exceededpython3.6 -m venv --upgrade <path_of_existing_env>
Error: User Rate Limit ExceededError: Command '['/Users/me/Sites/site/venv3/bin/python3', '-Im', 'ensurepip', '--upgrade', '--default-pip']' returned non-zero exit status 1.Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededpython3.6 -m venv --upgrade ENV_DIRError: User Rate Limit ExceededENV_DIR/binError: User Rate Limit ExceedednewError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded--upgradeError: User Rate Limit Exceeded
Error: User Rate Limit ExceededvenvError: User Rate Limit Exceeded
3

How to upgrade the Python version for an existing virtualenvwrapper project and keep the same name

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

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

I work on some projects that are Python 2 and some that are Python 3; while I'd love to use python3 -m venv, it doesn't support Python 2 environments When I start a new project, I use mkproject which creates the virtual environment, creates an empty project directory, and cds into it I want to continue using virtualenvwrapper's workon command to activate any project irrespective of Python version

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

Допустим, ваш существующий проект назван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

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
>>>
Error: User Rate Limit Exceeded
1

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

Error: User Rate Limit Exceeded~/.virtualenvs/myenv/.PythonError: User Rate Limit Exceeded
py.testError: User Rate Limit Exceeded
5

ументы, которые значительно ускоряют переустановку требований в совершенно новую версию. 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.

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

Error: User Rate Limit Exceeded
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 поверх существующего каталога.

22

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

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

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

Notice: В настоящее время,this is for Python 2.7.x only.

Если вы используете 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
Error: User Rate Limit Exceeded<EXISTING_ENV_PATH>/.PythonError: User Rate Limit Exceeded
Error: User Rate Limit Exceededburgundywall.com/post/update-all-python-virtual-environments
Error: User Rate Limit ExceededsetuptoolsError: User Rate Limit ExceededpipError: User Rate Limit Exceeded
Error: User Rate Limit Exceededbin/pythonError: User Rate Limit Exceeded
Error: User Rate Limit Exceededrmvirtualenv <env_name>Error: User Rate Limit Exceededvirtualenvwrapper.readthedocs.io/en/latest/…
1

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

0

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
61

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

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

EDIT

Я проверил этот подход (тот, который создает новый 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)

Error: User Rate Limit Exceededgithub.com/pypa/virtualenv/issues/437
Error: User Rate Limit ExceededvirtualenvError: User Rate Limit ExceededdidError: User Rate Limit Exceeded-pError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

Похожие вопросы