Как управлять средами с помощью 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