Конда заменяет потребность в virtualenv?

205

Недавно я обнаружил Conda после того, как у меня возникли проблемы с установкой SciPy, особенно в приложении Heroku, которое я разрабатываю.

С Conda вы создаете среду, очень похожую на ту, что делает virtualenv . Мои вопросы:

  1. Если я использую Conda, это заменит потребность в virtualenv? Если нет, то как мне использовать два вместе? Нужно ли устанавливать virtualenv в Conda или Conda в virtualenv?
  2. Мне все еще нужно использовать пипс? Если да, смогу ли я устанавливать пакеты с pip в изолированной среде?
Kritz
источник
Если вы заинтересованы в использовании conda и pip на Heroku, см., Например, github.com/faph/conda-pip-buildpack
faph
Спасибо. Я заметил, что на github есть множество сборочных пакетов conda для Heroku. Какие факторы я должен учитывать при принятии решения, какой buildpack использовать?
Криц
Обратите внимание, что вам все равно нужно будет использовать pip, если вы хотите установить пакеты, которые не доступны напрямую с серверов Continuum.
ali_m
Да, я видел, что они все еще на Django 1.8 (не 1.9). На данный момент я буду использовать conda, где это необходимо (scipy и numpy), и pip для всего остального - но все еще внутри conda.
Криц
Я думаю, что большинство сборок conda Heroku происходит от Кеннета Рейтца. С людьми, подстраивающими их под свои предпочтения. Просто проверьте, включают ли они поддержку conda и pip, если это то, что вам нужно. И если они поддерживают файл environment.yml. Вы всегда можете быстро просмотреть код пакета сборки, чтобы увидеть, нравится ли вам сценарий сборки, например, чтобы увидеть, как именно создаются среды.
faph

Ответы:

157
  1. Конда заменяет virtualenv. На мой взгляд, это лучше. Он не ограничивается Python, но может использоваться и для других языков. По моему опыту, это обеспечивает гораздо более плавный опыт, особенно для научных пакетов. Первый раз, когда я правильно установил MayaVi на Mac, был с conda.

  2. Вы все еще можете использовать pip. Фактически condaустанавливается pipв каждой новой среде. Он знает о pip-установленных пакетах.

Например:

conda list

перечисляет все установленные пакеты в вашей текущей среде. Установленные Conda пакеты выглядят так:

sphinx_rtd_theme          0.1.7                    py35_0    defaults

и те, которые установлены через pipимеют <pip>маркер:

wxpython-common           3.0.0.0                   <pip>
Майк Мюллер
источник
8
Есть ли какие-либо недостатки в использовании pip в среде Anaconda? Был ли когда-нибудь случай, когда вы захотите использовать pip, хотя пакет был доступен через Conda?
Клифгрей
Разница между дефисом и подчеркиванием? Что если имя пакета не имеет ни того, ни другого? Как дифференцировать тогда?
Том Хейл
1
Подчеркивание или дефис являются частью имени пакета. Это не имеет ничего общего с pip или conda. В <pip>показывает , что она была установлена с ПУМ в противном случае он устанавливается с Конда.
Майк Мюллер
4
Есть большая оговорка: «Конда знает о пакетах, установленных с помощью pip». Насколько я понимаю, в среде conda pip действует независимо, поэтому conda не может, например, деинсталлировать установленные пакеты pip
information_interchange
1
@clifgray - пакеты pip и conda, имеющие собственные разделяемые библиотеки, могут устанавливать двоичные несовместимые версии, которые будут вызывать всевозможные сбои в собственном мире (sigsegv-s и т. д.), которые трудно отладить для кого-то, кто не работает с отладчиком C. То же самое для пакетов только для Python, просто это легко понять.
Боба
61

Короткий ответ: вам нужна только Conda.

  1. Conda эффективно объединяет функциональность pip и virtualenv в одном пакете, поэтому вам не нужен virtualenv, если вы используете conda.

  2. Вы будете удивлены, сколько пакетов поддерживает conda. Если этого недостаточно, вы можете использовать pip под conda.

Вот ссылка на страницу conda, сравнивающую conda, pip и virtualenv:

https://docs.conda.io/projects/conda/en/latest/commands.html#conda-vs-pip-vs-virtualenv-commands .

Безумный физик
источник
34

Виртуальные среды и pip

Я добавлю, что создавать и удалять среды conda с Anaconda просто.

> conda create --name <envname> python=<version> <optional dependencies>

> conda remove --name <envname> --all 

В активированной среде установите пакеты через condaили pip:

(envname)> conda install <package>

(envname)> pip install <package>

Эти среды тесно связаны с управлением пакетами в виде пипы в conda , поэтому создавать среды и устанавливать пакеты как Python, так и не-Python просто.


Jupyter

Кроме того, установкаipykernel в среде добавляет новый список в раскрывающемся меню Kernels ноутбуков Jupyter, расширяя воспроизводимые среды для ноутбуков. Начиная с версии Anaconda 4.1, были добавлены nbextensions , облегчающие добавление расширений в ноутбуки.

надежность

По моему опыту, conda быстрее и надежнее при установке больших библиотек, таких как numpyи pandas. Более того, если вы хотите перенести свое сохраненное состояние среды, вы можете сделать это, поделившись или скопировав env.

pylang
источник
18

Установка Conda позволит вам создавать и удалять среды Python по своему усмотрению, предоставляя вам те же функциональные возможности, что и virtualenv .

В случае обоих дистрибутивов вы сможете создать изолированное дерево файловой системы, где вы сможете устанавливать и удалять пакеты python (возможно, с помощью pip) по своему желанию. Что может пригодиться, если вы хотите иметь разные версии одной и той же библиотеки для разных вариантов использования или просто хотите попробовать какой-нибудь дистрибутив и впоследствии удалить его, чтобы сэкономить место на диске.

Отличия:

Лицензионное соглашение. В то время как virtualenv распространяется под самой либеральной лицензией MIT , Conda использует лицензию BSD с 3 пунктами.

Конда предоставляет вам собственную систему управления пакетами. Эта система управления пакетами часто предоставляет предварительно скомпилированные версии (для большинства популярных систем) популярного не-Python программного обеспечения, что может облегчить работу некоторых пакетов машинного обучения. А именно, вам не нужно компилировать оптимизированный код C / C ++ для вашей системы. Хотя это является большим облегчением для большинства из нас, это может повлиять на производительность таких библиотек.

В отличие от virtualenv, Conda дублирует некоторые системные библиотеки, по крайней мере, в системе Linux. Эти библиотеки могут потерять синхронизацию, что приведет к несогласованному поведению ваших программ.

Вердикт:

Конда великолепна и должна быть вашим выбором по умолчанию, когда вы начинаете свой путь с машинного обучения. Это сэкономит вам время, возиться с gcc и многочисленными пакетами. Тем не менее, Конда не заменяет virtualenv. Это вносит некоторую дополнительную сложность, которая не всегда желательна. Это идет под другой лицензией. Возможно, вы захотите избежать использования conda в распределенных средах или на оборудовании HPC.

y.selivonchyk
источник
2
Не могли бы вы немного прояснить, почему «вы можете избежать использования conda в распределенных средах или на оборудовании HPC»? @ y.selivonchyk
Оливер Ху,
1
Я не согласен с некоторыми из этих выводов. «Непоследовательное поведение программы» является результатом неправильной настройки ваших программ для использования condaустановленного программного обеспечения и библиотек. А в HPC condaпредпочтительнее во многих случаях, фактически он используется администраторами HPC для замены таких вещей, как moduleсистемы. Это позволяет устанавливать программное обеспечение, установленное пользователем, и обеспечивать большую изоляцию программного обеспечения - две большие проблемы в HPC. Единственное предостережение, которое я испытываю, заключается в том, что многие файловые системы HPC имеют жесткие ограничения на количество файлов в каталоге, и conda создает тысячи файлов.
user5359531
9

Я использую оба, и (по состоянию на январь 2020 года) у них есть некоторые поверхностные различия, которые можно использовать для меня по-разному. По умолчанию Conda предпочитает управлять списком сред для вас в центральном расположении, тогда как virtualenv создает папку в текущем каталоге. Первый (централизованный) имеет смысл, если вы, например, занимаетесь машинным обучением и у вас есть пара широких сред, которые вы используете во многих проектах и ​​хотите перейти к ним из любого места. Последнее (для каждой папки проекта) имеет смысл, если вы делаете маленькие одноразовые проекты, которые имеют совершенно разные наборы требований к lib, которые действительно больше относятся к самому проекту.

Пустая среда, которую создает Conda, составляет около 122 МБ, тогда как virtualenv составляет около 12 МБ, поэтому это еще одна причина, по которой вы можете не разбрасывать среду Conda повсюду.

Наконец, еще одним поверхностным признаком того, что Conda предпочитает свои централизованные envs, является то, что (опять же, по умолчанию), если вы создаете Enda Conda в своей папке проекта и активируете его, префикс имени, который появляется в вашей оболочке, является (слишком длинным) абсолютным путь к папке. Вы можете исправить это, присвоив ему имя, но virtualenv по умолчанию работает правильно.

Я ожидаю, что эта информация быстро устареет, поскольку два менеджера пакетов соперничают за доминирование, но это компромиссы на сегодняшний день :)

Пэт Нимейер
источник
Хорошее объяснение! У вас есть какие-то трудности с их использованием? Вы когда-нибудь использовали pipenv?
Mikhail_Sam
8

Еще одна новая опция, и мой текущий предпочтительный метод настройки и запуска среды - это Pipenv.

В настоящее время это официально рекомендуемый инструмент для упаковки Python от Python.org.

Kritz
источник
1
Это вызвало «а? Что такое pipenv?», Что привело меня к reddit.com/r/Python/comments/8jd6aq/… и sedimental.org/the_packaging_gradient.html . Я все еще не знаю, что использовать, но, по крайней мере, я лучше информирован. Думаю.
Мэтт Уилки
После просмотра вступления и быстрого прочтения вступления, pipenv похоже, не в состоянии управлять версиями Python ...
Carles Alcolea
@CarlesAlcolea pipenv может также указать различные версии: pipenv --two для Python2 и pipenv - три для python3
Benoy
3

Да, condaнамного легче установить, чем virtualenv, и в значительной степени заменяет последний.

Лян Хуан
источник
6
Почему Anaconda предоставляет инструкции по установке виртуальной среды, если она их заменяет?
17
1
@jmh Anaconda не заменяет виртуальные среды, она заменяет специфический для Python инструмент управления виртуальной средой virtualenvболее общим инструментом управления виртуальной средой conda. Кроме того, Anaconda - это всего лишь дистрибутив Python +, который включает инструмент Conda; вопрос (и ответ) только о Конде.
Мерв
3
Этот ответ не добавляет ничего, кроме ответов, которые были задолго до этого.
Мерв
1

Я работаю в корпоративном, за несколькими брандмауэрами с машиной, на которой у меня нет прав администратора

В моем ограниченном опыте работы с Python (2 года) я сталкивался с несколькими библиотеками (JayDeBeApi, sasl), которые при установке через pip threw C ++ выявляют ошибку зависимости: требуется Microsoft Visual C ++ 14.0. Получите его с помощью "Microsoft Visual C ++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools

они хорошо установлены с conda, поэтому с тех пор я начал работать с conda env. Однако нелегко остановить conda от установки зависимости внутри c.programfiles, где у меня нет прав на запись.

Рохит Арора
источник