Оновіть python у 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 і перевстановити все.
Сем Долан

@Simon Walker. Точно така ж проблема. Мені належить оновити python 3.5.3 для виправлення помилок.
Мохаммед Шаріф C

Відповіді:


77

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

Якщо ваш virtualenv встановлений з тією ж версією старого python, і оновлення пакету virtualenv не є варіантом, ви можете прочитати це , щоб встановити virtualenv з потрібною вами версією python.

EDIT

Я перевірив цей підхід (той, що створює новий віртуаленв поверх старого), і він працював чудово для мене. Я думаю, що у вас можуть виникнути деякі проблеми, якщо ви перейдете з 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-пакети)


13
Він спеціально не хотів перевстановлювати будь-які пакунки, якщо це можливо. Очевидно, ви ніколи не встановлювали numpy від джерела, якщо не знаєте, чому це має значення;) підказка: це займає LOOOOOOOOOOOOOONG час.
Антті Хаапала

так, я це розумію. Але здається, що якщо він зробить virtualenv поверх іншого, пакунки не втрачаються, тому йому не доведеться перевстановлювати numpy чи будь-який інший пакет. Тим не менш, я думаю, він повинен спробувати це у новому virtualenv, якщо це не вдасться.
marianobianchi

Я вважаю, що нові версії virtualenv дійсно оновлені на місці, однак для старих версій вони навіть не перезаписали виконуваний файл python, що спричинило проблеми з принаймні одним випуском помилки python.
Антті Хаапала

4
Це не спрацювало для мене і, схоже, цього не слід: github.com/pypa/virtualenv/isissue/437
Kentzo

1
Я намагався створити нову virtualenvповерх старої, і зробив роботу. Мені довелося вказати, -pщоб вказати на правильну версію python.
osa

76

Якщо ви випадково використовуєте модуль venv, що постачається з Python 3.3+, він підтримує --upgradeпараметр. Згідно документації :

Оновіть каталог середовищ, щоб використовувати цю версію Python, якщо припустити, що Python було оновлено на місці

python3 -m venv --upgrade ENV_DIR

1
На жаль, це не працює на Ubuntu 16.04, де вони зламалися venvі відмовляються виправити це виходячи з того, що "ви могли просто використовувати virtualenv". EDIT: насправді це працює! Він також показує повідомлення про помилку про "securepip".
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, не вдається оновити.
користувач305883

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, спочатку deactivatevirtualenv, а потім оновіть 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

Єдиний файл, який мені довелося видалити, - це bin/pythonфайл.
Коен.

Для деяких старих версій Python видалення setuptoolsта pipнеобхідне.
Rockallite

1
Мені також довелося видалити <EXISTING_ENV_PATH>/.Python, що порушило створення virtualenv.
Kiran Jonnalagadda

2
На основі цієї відповіді я написав невеликий сценарій (з повною атрибуцією): burgundywall.com/post/update-all-python-virtual-environments
Курт

Ви можете фактично легко видалити своє віртуальне середовище, запустивши rmvirtualenv <env_name>і видаливши всі його вирівняні залежності :) Дивіться більше на сайті: virtualenvwrapper.readthedocs.io/en/latest/…
Нік Лукас

7

Я не зміг створити новий віртуаленв поверх старого. Але є інструменти в pip, які дозволяють значно швидше перевстановити вимоги в абсолютно новий вентиляційний апарат. Pip може скласти кожен із елементів у ваших вимогах.txt у пакет із колесом та зберігати їх у локальному кеші. Коли ви створюєте новий 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. Це зберігає вбудовані колеса в колесі-реж в моєму pip.conf.

З цього моменту, коли я встановлю будь-яку з цих вимог, він встановлює їх з коліс, що досить швидко.


1
Для більшості людей, на мою думку, використовувати обладнання для роботи труб має сенс, але для тих, хто налаштував свої virtualenvs, постоактивувати, попередньо активувати тощо, це не є бажаним варіантом, оскільки все, що втрачено, і має бути перероблене вручну.
dpwrussell

6

Як оновити версію Python для існуючого проекту virtualenvwrapper і зберегти те саме ім’я

Я додаю відповідь для тих, хто використовує відмінний virtualenvwrapper Doug Hellmann оскільки існуючі відповіді не зробили це для мене.

Деякий контекст:

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


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

Я перемістив свій домашній каталог з одного 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 зверху на існуючий каталог.


1

На ОС 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
>>>

приголомшливий! Дякую за цей дорогоцінний камінь
Mayur Patil

1

Я просто хочу уточнити, оскільки частина відповідей стосується, 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, якої ви ще не маєте десь у вашій системі, тому спочатку переконайтеся, що вам потрібна версія, а потім зробіть з неї всі необхідні венти.


1

Крок 1: Потрібно заморозити та взяти резервну копію існуючої програми

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

0

Для всіх з проблемою

Помилка: команда '[' / Користувачі / мені / Сайти / сайт / venv3 / bin / python3 ',' -Im ',' securepip ',' --upgrade ',' --default-pip ']' повернута не нульовою вихід 1.

Ви повинні встановити python3.6-venv

 sudo apt-get install python3.6-venv
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.