Как управлять средами с помощью conda для Python и R.

Среды Conda похожи на кузенов виртуальных сред Python. Оба служат, чтобы помочь управлять зависимостями и изолировать проекты, и они работают аналогичным образом, с одним ключевым отличием: среды conda не зависят от языка. То есть они поддерживают языки, отличные от Python.

☄️ В этом руководстве мы рассмотрим основы создания сред и управления ими с помощью conda для Python и R.

⚠️ Примечание. В этом руководстве мы будем использовать последние версии Conda v4.6.x, Python v3.7.y и R v3.5.z на macOS Mojave.

Оглавление

Conda vs. Pip vs. Venv - в чем разница?
Использование сред Conda
Установка пакетов
Управление средами
Среды С R
Дополнительная информация

Конда против Пипа против Венва - в чем разница?

Прежде чем мы начнем, некоторым из вас может быть интересно, в чем разница между conda, pip и venv.

Я рада, что вы спросили. Лучше не сказать: pip - это менеджер пакетов для Python. venv - это менеджер среды для Python. conda является менеджером пакетов и среды и не зависит от языка.

В то время как venv создает изолированные среды только для разработки Python, conda может создавать изолированные среды для любого языка (теоретически).

В то время как pip устанавливает пакеты Python только из PyPI, conda может и

  • Устанавливайте пакеты (написанные на любом языке) из репозиториев, таких как Anaconda Repository и Anaconda Cloud.
  • Установите пакеты из PyPI, используя pip в активной среде Conda.

Как это круто?

👉🏽 Для удобной, если немного устаревшей, диаграммы сравнения этих трех, нажмите здесь (не забудьте прокрутить вправо!).

Использование сред Conda

Создание сред

Чтобы создать среду с conda для разработки Python, запустите:

% conda create --name conda-env python                  # Or use -n

💥 Важно: Замените conda-env именем своей среды. С этого момента мы всегда будем использовать conda-env для названия нашей среды.

Эта среда будет использовать ту же версию Python, что и интерпретатор Python в вашей текущей оболочке. Чтобы указать другую версию Python, используйте:

% conda create -n conda-env python=3.7

Вы также можете установить дополнительные пакеты при создании среды, например, numpy и requests.

% conda create -n conda-env numpy requests

⚠️ Примечание. Поскольку conda обеспечивает соответствие зависимостей при установке пакетов, Python будет установлен вместе с numpy и requests 😁.

Вы также можете указать, какие версии пакетов вы хотите установить.

% conda create -n conda-env python=3.7 numpy=1.16.1 requests=2.19.1

⚠️ Примечание. Рекомендуется устанавливать все пакеты, которые вы хотите включить в среду, одновременно, чтобы избежать конфликтов зависимостей.

Наконец, вы можете активировать свою среду с помощью вызова:

% conda activate conda-env           
(conda-env) %                          # Fancy new command prompt

И отключите его с помощью:

% conda deactivate
%                                      # Old familiar command prompt

Где живут среды

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

% python3 -m venv /path/to/new/environment

С другой стороны, среды, созданные с помощью conda, по умолчанию живут в папке envs/ вашего каталога Conda, путь к которому будет выглядеть примерно так:

% /Users/user-name/miniconda3/envs          # Or .../anaconda3/envs

Я предпочитаю подход venv по двум причинам.

1️⃣ Это позволяет легко определить, использует ли проект изолированную среду, включив среду в качестве подкаталога.

my-project/
├── conda-env                    # Project uses an isolated env ✅
├── data                             
├── src                  
└── tests

2️⃣ Он позволяет вам использовать одно и то же имя для всех ваших сред (я использую «conda-env»), что означает, что вы можете активировать каждую с помощью одной и той же команды.

% cd my-project/
% conda activate conda-env

💸 Бонус: это позволяет вам назначить псевдоним команды активации и вставить ее в ваш .bashrc файл, что немного упростит жизнь.

⚠️ Примечание. Если вы храните все свои среды в папке env/ вашего Conda, вам придется дать каждой из них разные имена, что может вызвать затруднения 😞.

Итак, как разместить среды за пределами папки Conda env/? Используя флаг --prefix вместо --name при создании среды.

% conda create --prefix /path/to/conda-env             # Or use -p

⚠️ Примечание. Это создает среду с именем «conda-env» в указанном пути.

Это так просто. Однако размещение сред за пределами папки по умолчанию env/ имеет два недостатка.

1️⃣ conda больше не может найти вашу среду с флагом --name. Вместо этого вам нужно будет передать флаг --prefix вместе с полным путем среды. Например, при установке пакетов, о чем мы поговорим в следующем разделе.

2️⃣ В командной строке больше нет префикса с именем активной среды, а с ее полным путем.

(/path/to/conda-env) %

Как вы понимаете, это быстро становится беспорядком. Как, например, этот дурак.

(/Users/user-name/data-science/project-name/conda-env) %        # 😨

К счастью, есть простое решение. Вам просто нужно изменить параметр env_prompt в вашем .condarc файле, что можно сделать одним движением.

% conda config --set env_prompt '({name}) '

⚠️ Примечание. Это отредактирует ваш .condarc файл, если он у вас уже есть, и создаст его, если нет. Дополнительную информацию об изменении вашего .condarc файла см. В документации.

Теперь в вашей командной строке будет отображаться только имя активной среды.

% conda activate /path/to/conda-env
(conda-env) %                                        # Woohoo! 🎉

Наконец, вы можете просмотреть список всех ваших существующих сред.

% conda env list
# conda environments:
#
                         /path/to/conda-env
base                  *  /Users/username/miniconda3
r-env                    /Users/username/miniconda3/envs/r-env

⚠️ Примечание. * указывает на текущую активную среду. Немного раздражает то, что он будет указывать на «базу», даже если никакая среда не активна 🤷🏽‍♂️.

Установка пакетов

Есть два способа установить пакеты с conda.

1️⃣ Изнутри активной среды.

2️⃣ Из оболочки по умолчанию.

Последнее требует, чтобы вы указали на среду, в которой вы хотите установить пакеты, используя тот же флаг (--name или --prefix), который вы использовали для создания своей среды.

Первый работает одинаково хорошо независимо от того, какой флаг вы использовали.

💥 Важно: Мы настоятельно рекомендуем придерживаться первого подхода, поскольку он устраняет опасность непреднамеренной установки пакетов в масштабе всей системы.

♻️ Напоминание: Все среды в этом руководстве называются «conda-env». Вы можете заменить «conda-env» на имя вашей среды.

Из репозитория Anaconda

По умолчанию conda устанавливает пакеты из Репозитория Anaconda. Создав среду, вы можете установить дополнительные пакеты двумя способами.

1️⃣ Изнутри активной среды.

(conda-env) % conda install pandas=0.24.1                   # 🐼

2️⃣ Из оболочки по умолчанию.

% conda install -n conda-env pandas=0.24.1      # Or -p /path/to/env

Точно так же вы можете обновить пакеты в среде двумя способами.

1️⃣ Изнутри активной среды.

(conda-env) % conda update pandas

2️⃣ Из оболочки по умолчанию.

% conda update -n conda-env pandas             # Or -p /path/to/env

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

1️⃣ Изнутри активной среды.

(conda-env) % conda list

2️⃣ Из оболочки по умолчанию.

% conda list -n conda-env                      # Or -p /path/to/env

Из других репозиториев Conda

Если пакет недоступен в Репозитории Anaconda по умолчанию, вы можете попробовать найти его в Anaconda Cloud, где размещены пакеты Conda, предоставленные сторонними репозиториями, такими как Conda-Forge.

Чтобы установить пакет из Anaconda Cloud, вам нужно использовать флаг --channel, чтобы указать репозиторий, из которого вы хотите установить. Например, если вы хотите установить opencv из Conda-Forge, вы должны запустить:

(conda-env) % conda install --channel conda-forge opencv     # Or -c

К счастью, conda отслеживает, откуда был установлен пакет.

(conda-env) % conda list
# packages in environment at /path/to/conda-env:
#
# Name                Version          Build             Channel
numpy                 1.16.1           py37h926163e_0
opencv                4.1.0            py37h0cb0d9f_3    conda-forge
pandas                0.24.2           py37h0a44026_0

Пустые записи канала для numpy и pandas представляют default_channels, который по умолчанию установлен в репозиторий Anaconda.

⚠️ Примечание. Для краткости выше мы показали только некоторые пакеты.

Вы также можете навсегда добавить канал в качестве источника пакета.

% conda config --append channels conda-forge

Это изменит ваш .condarc файл, чтобы он выглядел примерно так:

env_prompt: '({name}) '      # Modifies active environment prompt
channels:                    # Lists package sources to install from
- defaults                   # Default Anaconda Repository
- conda-forge

🚨 Внимание! Порядок ваших каналов имеет значение. Если пакет доступен по нескольким каналам, conda установит его из канала, указанного наивысшим в вашем .condarc файле. Подробнее об управлении каналами см. В документации.

Из PyPI

Если пакет недоступен в Anaconda Repository или Anaconda Cloud, вы можете попробовать установить его с помощью pip, который conda устанавливается по умолчанию в любой среде, созданной с помощью Python.

Например, чтобы установить запросы с pip, вы должны выполнить:

(conda-env) % pip install requests

Обратите внимание, что conda правильно указывает PyPI как канал для requests, что упрощает идентификацию пакетов, установленных с помощью pip.

(conda-env) % conda list
# packages in environment at /path/to/conda-env:
#
# Name                Version          Build             Channel
numpy                 1.16.1           py37h926163e_0
opencv                4.1.0            py37h0cb0d9f_3    conda-forge
pandas                0.24.2           py37h0a44026_0
requests              2.21.0                   pypi_0    pypi

🚨 Внимание! Поскольку pip пакеты не обладают всеми функциями conda пакетов, настоятельно рекомендуется по возможности устанавливать пакеты с conda. Чтобы узнать больше о пакетах conda и pip, нажмите здесь.

Управление средой

Файлы среды

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

Конда называет это файлами окружения. Они являются точным аналогом файлов требований для виртуальных сред Python.

Как и все остальное, вы можете создать файл окружения двумя способами.

1️⃣ Изнутри активной среды.

(conda-env) % conda env export --file environment.yml       # Or -f

2️⃣ Из оболочки по умолчанию.

% conda env export -n conda-env -f /path/to/environment.yml

Ваш environment.yml файл будет выглядеть примерно так:

name: null                          # Our env was made with --prefix
channels:
  - conda-forge                     # We added a third party channel
  - defaults
dependencies:
  - numpy=1.16.3=py37h926163e_0
  - opencv=3.4.2=py37h6fd60c2_1
  - pandas=0.24.2=py37h0a44026_0
  - pip=19.1.1=py37_0
  - pip:                            # Packages installed from PyPI
    - requests==2.21.0
prefix: /Users/user-name/data-science/project-name/conda-env

⚠️ Примечание. Для краткости выше мы показали только некоторые пакеты.

Дублирование сред

Имея файл environment.yml, вы можете легко воссоздать среду.

% conda env create -n conda-env -f /path/to/environment.yml

💸 Бонус: вы также можете добавить пакеты, перечисленные в файле environment.yml, в существующую среду с помощью:

% conda env update -n conda-env -f /path/to/environment.yml

Среды с R

Чтобы использовать R в среде, все, что вам нужно сделать, это установить пакет r-base.

(conda-env) % conda install r-base

Конечно, вы всегда можете сделать это при первом создании среды.

% conda create -n r-env r-base

⚠️ Примечание. Замените «r-env» именем своей среды.

Пакеты Conda R доступны в канале R Anaconda Cloud, который по умолчанию включен в список Conda default_channels, поэтому вам не нужно указывать канал R при установке пакетов R, например, tidyverse.

% conda activate r-env
(r-env) % conda install r-tidyverse                

⚠️ Примечание. Все пакеты из канала R имеют префикс «r-».

При желании вы можете установить пакет r-essentials, который включает более 80 самых популярных научных пакетов R, таких как tidyverse и shiny.

(r-env) % conda install r-essentials

Наконец, если вы хотите установить пакет R, который не предлагает Conda, вам нужно будет собрать пакет из CRAN, инструкции к которому вы можете найти здесь.

Дальнейшее чтение

Если случайно вы задаетесь вопросом, как именно работают среды Conda, посмотрите эту аннотацию о том, как виртуальные среды Python делают свое дело. Среды Conda работают точно так же.

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

Ура и приятного чтения.

Обновление 08/2019: версии Conda

Вы действительно узнаете что-то новое каждый день. Сегодня утром мой друг, Кумар Шишир, рассказал мне об еще одной невероятно полезной conda функции: ревизиях conda.

Я не мог поверить своим ушам. Как я мог так долго томиться в полном и полном неведении о такой блестящей особенности?

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

Например, предположим, что мы создали новый conda-env и установили numpy, а затем pandas. Наша история изменений будет выглядеть так:

(conda-env) % conda list --revisions       
2019-08-30 16:04:14  (rev 0)               # Created our env
+pip-19.2.2
+python-3.7.4
2019-08-30 16:04:30  (rev 1)               # Installed numpy
+numpy-1.16.4
+numpy-base-1.16.4
2019-08-30 16:04:39  (rev 2)               # Installed pandas
+pandas-0.25.1
+python-dateutil-2.8.0
+pytz-2019.2

Представьте, что мы больше не хотим иметь pandas в нашей среде, потому что она (каким-то образом) несовместима с нашими предыдущими зависимостями или потому, что она нам больше не нужна.

Изменения позволяют нам откатить нашу среду к предыдущему воплощению:

(conda-env) % conda install --revision 1
(conda-env) % conda list --revisions         # (Showing latest only)    
2019-08-30 16:08:05  (rev 3)                 # Uninstalled pandas 
-pandas-0.25.1
-python-dateutil-2.8.0
-pytz-2019.2

Знак рядом с каждым пакетом означает, что мы успешно удалили их из нашей среды. Теперь мы готовы вернуться к науке о данных 😎.

Обновление 02/2020: очистите свои архивы!

По мере того, как вы создаете больше проектов, каждый со своей собственной средой, вы начнете быстро накапливать tarballs из установленных пакетов.

Чтобы избавиться от них и освободить место на диске, запустите:

% conda clean --all                     # no active env needed