Установите почти безболезненную виртуальную установку Python с помощью pyenv, pyenv-virtualenv и Homebrew.

Содержание

Помощь и дополнительная информация

Что вы знаете о своей установке Python?

  1. Перейдите в командную строку и введите whence python (или command -v python). Если этот путь к файлу вас удивит, дайте себе 1 балл.
  2. Введите which -a python. Если вы получили 2–3 результата, и ни один из них не является символической ссылкой, дайте себе 1 балл. Если вы получили более трех результатов, ставьте себе 2 балла.
  3. Если вы используете conda, найдите свой conda файл конфигурации. Если вы не знаете, где он находится, поставьте себе 2 балла. Если вы можете его найти, но удивлены, увидев, что в нем, поставьте себе 1.
  4. Найдите папку (и) вашей виртуальной среды. Если вы не можете или их не существует, дайте себе 2 балла. Если они пустые или редкие, поставьте себе 1.
  5. Откройте свой профиль bash / zsh или аналогичный. Если это предложение не имеет для вас смысла, поставьте себе 2 балла. Если ваша переменная PATH выглядит так, как будто кто-то разгромил вашу клавиатуру, дайте себе 1.
  6. Если вы обычно не создаете виртуальную среду или контейнер для каждого нового проекта, дайте себе 1 балл.

Как дела?

  • 0–3 балла: вы разбираетесь в своей системе и, вероятно, можете диагностировать большинство проблем среды Python. Настроить рабочий процесс виртуальной среды, описанный в этой статье, не составит труда.
  • 4–7 баллов: Вероятно, в вашей среде Python есть какой-то мусор. Более продуманный подход к виртуальным средам может избавить вас от разочарований.
  • 7–10 баллов: Многие из раздражений, которые вы, вероятно, испытываете при работе с pip и conda, исчезнут, если вы узнаете немного больше о том, как ваш компьютер видит пакеты Python. Вы узнаете, как обрабатывать противоречивые требования в разных проектах, не запутывая базовую среду.

Но зачем мне виртуальные среды?

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

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

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

Что такое венв и почему меня это должно волновать?

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

Виртуальные среды, по сути, являются перехватчиками пути. Переменная среды PATH сообщает вашей операционной системе, в каких каталогах ей следует искать исполняемые файлы. Когда вы активируете venv, вы временно перенаправляете свой PATH, чтобы исполняемые файлы могли «видеть» только интерпретатор, пакеты и символические ссылки на инструменты, которые находятся внутри каталога venv. Вы можете убедиться, что venvs изменяет ваш PATH, запустив

внутри виртуальной среды, а затем снова за ее пределами.

Изменяя PATH во время его активации, виртуальная среда позволяет создавать параллельные разрозненные хранилища, в которых могут сосуществовать противоречивые среды Python.

Это гениально простая идея с запутанным исполнением.

Почему Python так сильно все испортил?

У Python фантастическое сообщество с открытым исходным кодом, но это также означает распространение инструментов и методов для всего.

Вы можете, например, скачать Python:

  • через двоичный установщик
  • скачав Anaconda
  • используя Homebrew
  • повторяя «Python» перед зеркалом

и заканчиваются установками в разных местах (не говоря уже о вашей системе Python, которую вы никогда не должны трогать).

Пакеты не всегда обновляются одновременно, и многие из них несовместимы друг с другом или даже с версией Python или Anaconda, которую вы используете. Пакеты из разных каналов в conda даже не гарантированно не конфликтуют. Если вы загружаете все в одну и ту же большую среду, неизбежно возникнут противоречивые зависимости, и что-то будет сломаться.

Не говоря уже о различных инструментах, таких как pip, pipx, conda, поэзия, штриховка, pipenv, pyenv, virtualenv, pyvenv, pyenv-virtualenv, virtualenvwrapper, pyenv-virtualenvwrapper и venv… которые, несмотря на очень похожее звучание, часто не даже совместимы друг с другом.

Еще одна причина не использовать anaconda вне контейнера - вы не знаете, что запускаете. В некоторых странных случаях сценарий активации anaconda настолько сильно искажает среду системы перед очисткой pyenv, что единственный быстрый способ исправить ошибку проблема заключается в том, чтобы добавить HOST=$(hostname) к .zshrc.

Более того, ваши venv могут находиться во множестве разных каталогов, в зависимости от того, какие инструменты вы используете (или не используете). Это довольно быстро становится громоздким.

Небеса помогут вам, если вы тоже хотите иметь чистую установку R, не говоря уже о той, которая хорошо работает с сеткой. И удачи в установке правильных ядер IPython для ваших ноутбуков Jupyter.

Что происходит, когда вы облажаетесь?

От «слегка раздражающего» до «катастрофически ужасного»:

  • Вы не можете импортировать пакеты и не знаете почему. Это очень раздражает, и вы тратите много времени на поиск в Google, но безрезультатно.
  • Интерпретатор для Jupyter / R Studio / Spyder / и т. Д. не можете найти нужную версию R или Python, которую хотите использовать, потому что ваша переменная пути очень запутана. Вам нужно время, чтобы очистить его, и вы забываете, что в первую очередь хотели проанализировать.
  • Вы не можете conda install что-то сделать, поэтому вместо этого pip install вы получите сообщение об ошибке, в котором говорится, что что-то сломалось в незнакомом файле. Вы тратите слишком много времени на StackOverflow и получаете головную боль, читая исходный код какой-то библиотеки на GitHub. (Я расскажу о колесах и яйцах в другом посте из этой серии блогов.)
  • Вы пытаетесь установить что-то с помощью conda, но получаете ужасное сообщение «Найдены конфликты! Ищем несовместимые пакеты. Это может занять несколько минут ». сообщение. (Если вы никогда не задумывались о прагматических последствиях временной сложности в алгоритмах поиска, это обязательно поможет вам.) Вы много ругаетесь, стирая свою установку и восстанавливая Anaconda из резервной копии.
  • Вы устанавливаете пакет в свою базовую среду и полностью разрушаете его из-за конфликтов зависимостей. Вы тратите день на переустановку Python и среды разработки для науки о данных.

Это правдивые истории.

Хорошо, я убежден. Как вы настраиваете виртуальные среды?

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

  • Чистый
  • Гибкий
  • Максимально автоматический
  • Устойчив к ошибкам пользователя
  • Неактивная разработка
  • Скорее всего, получит надежную поддержку

Предостережения: Я использую macOS Mojave на MacBook Pro с zsh. Большинство этих инструкций применимо к другим Unix-подобным системам, но не все они будут работать в Windows. На Mac Каталина заменила bash на zsh, но учтите, что это руководство не протестировано на новейшей версии macOS. Ваш опыт, вероятно, будет отличаться, но вы обязательно узнаете что-то на этом пути.

Но сначала: подумайте о резервных копиях

В дополнение к использованию контроля версий вам действительно стоит подумать о резервном копировании файлов в облаке. В случае катастрофы получить возможность просто вернуться к предыдущему снимку жесткого диска - огромное облегчение.

Я использую Arq Cloud Backup, который работает аналогично git, довольно дешев и почти автоматизирован. Для Zotero, точечных файлов и файлов меньшего размера, к которым мне нужен более прямой доступ, я использую Sync (по сути, Dropbox со сквозным шифрованием, соответствующий GDPR).

Использование pyenv с pyenv-virtualenv

Опять же, есть много способов установить программное обеспечение, но я обнаружил, что управление пакетами с помощью Homebrew, установка версий Python с помощью pyenv и обработка venv с помощью pyenv-virtualenv дает мне максимальную гибкость с минимальными трудностями.

Так как вы это делаете?

Шаг 0: Очистите свой сайт Superfund

Во-первых, самая болезненная часть: взломать вашу старую установку. Извините. Это должно быть сделано.

Однако, прежде чем что-либо касаться, убедитесь, что вы не удалили системный Python. Если вы работаете на Mac, это Python 2.7, который нужен вашему компьютеру. Удалите это, и вы перережете ему ствол мозга. Не трогайте файлы Python, которые находятся в ваших usr/bin и /System/Library/Frameworks/Python.framework файлах.

Повторяем: не трогайте системные файлы Python.

Однако установленный вами Python должен уйти. Поэтому, если вы установили его через двоичный установщик с python.org, удалите приложение. Если вы установили Python через Anaconda, вам придется установить anaconda-clean (и насладиться иронией установки дополнительных Anaconda для удаления Anaconda), чтобы удалить программное обеспечение:

Эта строка удалит Anaconda и создаст папку .anaconda-backup, обычно в вашем домашнем каталоге. Вы можете спрятать это в безопасном месте или удалить. Anaconda оставляет после себя некоторые остатки, которые не удаляются при автоматической установке, поэтому вам придется вручную удалить папки .anaconda и .condarc, а также папку ~ / anaconda3 (или anaconda2, в зависимости от вашей версии).

Еще раз убедитесь, что вы позаботились о незавершенных делах, выполнив следующий поиск (ваш может быть в нижнем регистре):

Шаг 1. Изучите свой профиль оболочки

Наконец, проверьте свой .bashrc или .bash_profile (или .zshrc, особенно если вы недавно обновили свой Mac) и удалите строки, которые были там написаны, когда когда-то вы запускали conda activate.

Этот файл, вероятно, находится в вашем корневом каталоге пользователя - где вы окажетесь, если выполните cd без указания имени каталога. Если вы работаете на Mac и не видите никаких точечных файлов, нажатие ⌘ + ⇧ + . (command-shift-period) покажет ваши скрытые файлы.

Ваш профиль оболочки входа будет иметь имя вроде .bashrc или .zshrc. (Подробнее об этом мы поговорим позже.)

Когда вы откроете этот файл, вы увидите что-то вроде этого:

Удалите его или закомментируйте с помощью #, если нервничаете. (В другом посте мы поговорим о том, как управлять своими точечными файлами.)

Вы также можете увидеть что-то в своем PATH, которое выглядит следующим образом:

Вырежьте часть / anaconda3, убедившись, что остальная часть PATH имеет смысл и разделена двоеточиями.

После изменения этого файла вам потребуется перезапустить оболочку.

Замените .zshrc именем файла конфигурации, если оно не совпадает. В оставшейся части этого урока я буду говорить о zsh, потому что это то, что я использую.

Шаг 2: Установите pyenv с Homebrew

Я использую Homebrew для управления пакетами на Mac, но подумываю о переходе на Nix. В любом случае вы должны использовать диспетчер пакетов! Homebrew - это, по сути, просто Ruby и git, и он хорошо справляется с управлением зависимостями, а также поддерживает организацию и контроль версий ваших приложений. У него также есть большое и дружелюбное сообщество, которое может попросить о помощи. В разные дистрибутивы Linux часто встроены собственные менеджеры пакетов. Какой менеджер пакетов вы выберете, менее важен, чем факт его использования.

Если у вас еще нет Homebrew, добавьте эту статью в закладки. Получите Homebrew, установите его, настройте, а затем вернитесь и следуйте этим инструкциям. Я даже закладку здесь для тебя поставлю.

Возобновите настройку Venv здесь (С возвращением!)

С Homebrew, brew install python3. Если вы хотите также установить Python 2, вы можете brew install python2 или просто brew install python, оба из которых указывают на репозитории Python 2 от Homebrew, так что будьте осторожны. Вот документация. Для неосторожных есть много ловушек.

Дополнительное примечание: Мы еще не настроили venv, но для справки в будущем: когда вы brew install вещи, требующие Python, вы не должны находиться в виртуальной среде.

Перед следующим шагом убедитесь, что только что установленный Python 3.x является активным. Потом:

Pyenv - это инструмент, который позволяет одновременно устанавливать несколько Python, даже несколько версий Anaconda! Все они будут жить в своих отдельных средах, и вам не придется беспокоиться о конфликтах между pip и conda.

Шаг 3. Настройте pyenv и pyenv-virtualenv

Затем вам нужно установить переменную PATH. Переменная PATH - это просто список каталогов, разделенных двоеточиями, в которых операционная система выполняет поиск слева направо. Когда вы выполняете команду типа python или pip, ваша ОС перемещается по вашему PATH в поисках каталогов с таким именем.

Интерлюдия: грунтовка по PATH и профилям

Давайте сделаем небольшой перерыв, чтобы объяснить, почему мы собираемся делать то, что собираемся делать.

Помните ваш файл .zshrc? Когда вы открываете новую оболочку входа в систему, то есть сеанс для взаимодействия с вашим компьютером из командной строки, содержимое этого файла сообщает ему, как вести себя в этом сеансе. («Rc» в .zshrc означает «запускать команды».) Вот почему PATH определен в вашем профиле оболочки.

Pyenv - оператор коммутатора вашей операционной системы.

Когда вы отправляете свой .zshrc, вы получаете ПУТЬ, который там хранится. Pyenv вставляет каталог прокладок в самое начало PATH:

Каталог прокладок - это коммутатор. Pyenv поддерживает прокладки, соответствующие каждой команде Python в каждой установленной версии Python в вашей системе.

Прокладки - это операторы распределительного щита. Это легкие скрипты, которые принимают ваши вызовы (команды Python) и подключают их к нужному получателю (соответствующий исполняемый файл в pyenv).

Итак, когда вы выполните conda install keras, pyenv будет:

0. Решите, какую версию Python использовать
1. Найдите в PATH исполняемый файл с именем, которое соответствует conda
2. Найдите прокладку pyenv с именем conda в $ (pyenv root) / shims
3. Запустите прокладку с именем conda, которая перенаправляет conda install keras на pyenv.

Также существует путь pyenv Python! В pyenv порядок приоритета:

0. Переменная PYENV_VERSION (которую можно установить с помощью pyenv shell)
1. Файл .python_version каталога (который мы можем изменить с помощью pyenv shell для одноразового изменения или pyenv local для чего-то более постоянного)
2 .Первый файл .python_version, который он может найти, рекурсивно просматривая каждый родительский каталог, пока не достигнет корня
3. Глобальный файл $ (pyenv root) / version, который вы можете изменить с помощью pyenv global.

Вернуться к настройке

Теперь, когда вы понимаете, что делаете, вот как это сделать:

Определите корневой каталог для pyenv как .pyenv, добавив следующий код в свой файл .zshrc. (Официальная документация pyenv предлагает вам записать следующие переменные в файл .zshenv, но .zshrc также работает и эквивалентен в большинстве случаев.) Переменная $ HOME - это ваш root-пользователь.

Спасибо @journeydatas и @ dany.savard за полезные комментарии

В официальной документации pyenv указано, что эти строки следует добавлять через командную строку, что может несколько запутать. Если вы это сделаете, убедитесь, что вы используете >>, а не >, иначе вы перезапишете свой файл вместо объединения.

Включите прокладки (операторы коммутатора) для управления PATH, добавив этот текст в свой .zshrc:

Опять же, если вы следуете документации pyenv, ваши операторы экспорта будут из командной строки:

Шаг 4: Установите pyenv-virtualenv

Pyenv-virtualenv - это подключаемый модуль pyenv, который намного упрощает управление средами venvs и conda.

Настройте virtualenv-init, если вы хотите автоматически активировать и деактивировать виртуальные среды при входе и выходе из каталогов, содержащих файл .python-version:

Убедитесь, что эта строка идет после той, которую вы добавили для pyenv.

Файлы версии Python создаются путем выполнения pyenv local или путем создания файла вручную и помещения в него имени допустимой среды pyenv.

Шаг 5: Загрузите версии Python

Вы можете увидеть, какие версии Python доступны для загрузки, выполнив pyenv install --list.

Установите то, что вам нравится, или несколько, с pyenv install. (Вы всегда можете удалить вещи с помощью pyenv uninstall.)

Обязательно установите глобальный Python на pyenv global \d.\d.\d, заменив \d соответствующими цифрами.

Вы можете установить одноразовую версию для оболочки, с которой вы сейчас работаете pyenv shell.

Далее мы узнаем, как настроить Python для каждого отдельного проекта с помощью pyenv local и файла .python-version.

Шаг 6: Создайте виртуальную среду!

У вас должен быть каталог для каждого проекта и виртуальная среда для каждого каталога. Эта структура выполняет две важные функции:

  1. Он поддерживает правильную организацию ваших вещей, что упрощает разделение проектов, управление зависимостями и предотвращение того, чего там не должно быть. (Кому нравится отменять коммиты git?)
  2. Он позволяет вам создать отдельный файл .python-version для каждого каталога (и, следовательно, для каждого проекта), что означает, что pyenv-virtualenv может автоматически переключаться в подходящую среду для вас, когда вы меняете каталоги.

Сделайте папку проекта и cd в нее.

Установите свой проект Python с pyenv local $PYTHON_VERSION.

Убедитесь, что вы используете тот, который вам нужен (выходные данные должны показать, какой интерпретатор Python использует оболочка и как он был установлен).

Теперь самое интересное. Вы собираетесь создать виртуальную среду. В отличие от Venv, управляемых вручную, pyenv-virtualenv объединяет все ваши виртуальные среды в один каталог, а не разбрасывает их по файлам вашего проекта. Это действительно здорово, но это означает, что вы не можете просто назвать их всех venv. Хорошая мнемоника - дать им то же имя, что и ваш проект, чтобы вы запомнили, какие вещи идут вместе.

Личные предпочтения: я называю свои среды venv- $ PROJECT_NAME. Это упрощает их организацию и помогает поддерживать совместимость со старыми файлами .gitignore, которые обычно предполагают, что venv - это имя вашей виртуальной среды.

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

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

Шаг 7. Активируйте виртуальную среду.

Чтобы активировать новую среду и установить ее в качестве локального Python проекта, вам необходимо выполнить:

or

в зависимости от того, выбрали ли вы дистрибутив Anaconda для своего базового Python. (Вы также можете использовать $ source activate для модуля venv.)

Шаг 8: все, что вы хотите

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

Вот суть GitHub со сценарием, который сделает это за вас. Загрузите его (вам может потребоваться запустить chmod +x newproj.sh, чтобы убедиться, что это исполняемый файл). Затем просто используйте его для создания новых проектов, передав ему версию Python, которую вы хотите использовать, и имя вашего проекта:

В качестве награды за упорный труд перейдите в мой следующий блог, чтобы увидеть все действительно крутые трюки, которые Visual Studio Code может делать сейчас (например, автоматический выбор правильного виртуального интерпретатора для каталога вашего проекта 😗 👌).

В следующих статьях мы рассмотрим самый простой способ заполнить ваши среды нужными вам пакетами из requirements.txt или файла среды, а также с помощью Docker, Binder, RStudio Cloud и других контейнеров или облачных вычислений. IDE, когда вам не нужна выделенная виртуальная среда.

Развивайте как душе угодно.

ПОМОЩЬ!!

Я забыл команды.

Одна из причин, по которой я предпочитаю pyenv, заключается в том, что он хорошо документирован, а справку легко получить, не выходя из командной строки. Алгоритм выхода из игры:

  • выполнить pyenv commands
  • выберите команду из списка
  • выполнить pyenv $COMMAND_NAME --help
  • прочтите примечания по использованию и примеры

Этот метод решит множество ваших насущных проблем.

Где все мои пиенв?

Если вы все настроили правильно, все ваши файлы pyenv, включая все виртуальные среды и версии Python, которые создает pyenv-virtualenv, должны находиться в $ HOME / .pyenv.

Если нет, проверьте свою конфигурацию! (Мы рассмотрим символические ссылки, Homebrew и организацию файлов более подробно в другом посте.) Вы, вероятно, назвали что-то по-другому, использовали другой менеджер пакетов, создали каталоги где-то кроме root или не начали с чистого листа ( что-то еще заглушало ваш PATH).

Мои виртуальные среды отображаются в папке моего проекта / они не там, где я думал / они не работают.

Вероятно, вы создали свою среду с virtualenv вместо pyenv virtualenv. Да, они разные. Да, это раздражает. Я рекомендую добавить псевдоним к вашему .zshrc, чтобы вы не делали этого.

Если у вас возникли проблемы с выполнением любой из команд pyenv, дважды проверьте, что вы добавили операторы init в свой .zshrc в правильном порядке. В случае сомнений printenv, which python и echo $PATH - хорошие средства диагностики для проверки переменных среды, используемого вами Python и того, что находится на вашем пути в любой момент времени.

Подскажите, как удалить все эти вещи, которые вы заставили меня делать.

Я ненавижу учебники, в которых не рассказывают, как избавиться от вещей. Чтобы увидеть всех созданных вами venv и питонов, выполните pyenv versions. Чтобы удалить какие-либо из них, которые вам больше не нужны, вы можете просто удалить каталог или pyenv uninstall $VERSION_OR_VENV. Тем не менее, я рекомендую сделать запись среды с помощью pip freeze > requirements.txt или conda env export > environment.yml, чтобы вы могли воссоздать ее, если вам нужно.

Если вы хотите избавиться от всего, достаточно rm -rf .pyenv. Вы также можете brew uninstall и pyenv, и pyenv-virtualenv, если хотите.

Это команда удаления для Homebrew:

Благодаря pyenv вы можете удалить Python, удалив файлы, в которых хранятся ваши виртуальные среды. Даже дистрибутивы Anaconda. Никакой анаконды-очистки не требуется.

Разве это не приятно?

Это круто. Что еще я могу сделать?

Оставайтесь рядом и узнайте о:

  • Использование командной строки для оптимизации настройки и рабочего процесса
  • Превращение репозиториев GitHub в виртуальные среды с помощью repo2docker
  • Временные venv, облачные IDE, такие как Binder и RStudio Cloud, Minikube
  • Колеса и яйца, или почему вы не должны смешивать pip и conda, если вы действительно не уверены в том, что делаете
  • Создание экосистемы проекта из файла требований или спецификации среды или наоборот
  • Более подробно о символических ссылках, Homebrew и организации файлов в вашей ОС, если вы все еще не уверены
  • Обеспечение кросс-лингвистической работы всех этих компонентов

Теперь вы знаете гораздо больше о своей установке Python.

Управление вашими зависимостями и практика хорошего контроля версий упростят управление вашими индивидуальными проектами; поможет вам легче создавать файлы требований для ваших проектов GitHub; позволяют клонировать среды и реплицировать проекты данных; и улучшите вашу способность предотвращать проблемы и - когда они действительно случаются - выявлять их источники и решения.

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

// спасибо Майклу Карлайлу за то, что он подопытный кролик, укусивший питона в ответ.