Найти в Дзене

Совместное использование Conda и PIP - разрешение конфликтов

В релизе Conda 4.6.0 добавлена ​​улучшенная поддержка взаимодействия между Conda и PIP. Эта функция все еще экспериментальная и поэтому по умолчанию отключена.

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

Если вы хотите попробовать эту функцию, вы можете установить следующую настройку в файле
".condarc":

Файл у вас по пути (для Windows):

Users\UserName\.condarc

Внесите в него:

pip_interop_enabled: true

Команда включения опции в терминале Conda:

conda config --set pip_interop_enabled True


Примечание: включение этой опции может замедлить работу Conda.

После включения опции требуется помнить, что при использовании в репозитории PIP вместе с Conda, надо использовать ключ:

"--user" ("-U")

Этот ключ явно указывает, что PIP должен работать с пакетами ограничиваясь только "пользовательским хранилищем пакетов"

пример: ~/.local/lib/pythonX.Y/site-packages

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

Чтобы проверить, где находится ваша user-папка, выполните команду:

python -m site --user-base

Странно, но официальная документация Anaconda утверждает, что:

- используйте pip только после conda
- установите как можно больше требований с помощью conda, затем используйте pip
- pip следует запускать с использованием –upgrade-strategy только-при-необходимости (по умолчанию)
- не используйте pip с аргументом –user, избегайте всех установок "users”


Ну что же, тестируем...

pip не видит пакеты Conda
pip не видит пакеты Conda

VENV создано с помощью Conda командой:

conda create -n test310 python=3.10

Conda видит все, а PIP не видит ничего, кроме своих пакетов.

Команда:

pip install psutil
Conda увидела пакет
Conda увидела пакет

Conda увидела пакет, поставленный с помощью PIP, и даже определили "канал", откуда пакет был установлен.

Команда:

conda uninstall psutil
conda install psutil
При инсталляции Conda взяла тот же пакет с conda_forge
При инсталляции Conda взяла тот же пакет с conda_forge

Conda тот же пакет взяла с conda_forge канала (у себя).

После установки команды:

conda list
pip list
pip видит пакет, поставленный Conda
pip видит пакет, поставленный Conda

PIP увидел пакет, поставленный Conda из своего канала!

Пробуем ставить "torch" командой "conda install torch" - отказ "Не найден на этих каналах", хотя в каналах как раз числится "pytorch"!

Да и * с тобою, золотая рыбка: "pip install torch" - ставит (я в другом venv ставлю).

pip list
conda list
Conda видит новые пакеты
Conda видит новые пакеты

Conda УВИДЕЛА все новые пакеты, поставленные PIP!

conda list --explict
Нет URL
Нет URL

На пакеты, поставленные PIP, Conda не может найти URL, хотя в ней прописан канал "pypi"...

Но нас интересует не это, а то, сможет ли Conda экспортировать все те пакеты, которые имеются в нынешнем VENV, вместе с пакетами, установленными с помощью PIP - нас интересует "воспроизводимость"!

conda env export > test.yml
pip-секция стоит отдельно
pip-секция стоит отдельно

Как видим, Conda прекрасно справилась со всеми пакетами!

Теперь попробуем создать "окружение" из этого YML, отредактируем файл, изменив имя "окружения" в первой строке на "test1" и запустим:

conda env create -f test.yml
Создалось новое venv
Создалось новое venv
Все воспроизводимо
Все воспроизводимо

Именно так воспроизводится Cond-ой экспорт и импорт "виртуального окружения" при "винегрете пакетов" из разных каналов.

Conda первыми ставит именно свои пакеты, отдавая список пакетов pip ему самому разбираться "что там, и с чем кушать".

И при этом импортированное VENV работоспособно в питоне без потери всех установленных пакетов! При экспорте c помощью PIP, он не увидит пакеты Conda (и любые другие), и отправит на "экспорт" только свои!

Pip выкинул не свои пакеты
Pip выкинул не свои пакеты

Выводы:

  • Conda показывает явное преимущество перед PIP в экспорте/импорте пакетов.
  • клонирование venv через Conda с помощью YML-файлов прекрасно воспроизводит ВСЕ виртуальное окружение вместе с пакетами PIP.
  • PIP проигрывает Conda с универсальности использования, не видя никакие пакеты, кроме тех, которые есть в репозитории "pypi".

Это все, что нужно помнить, если вы пользуетесь то Conda, то PIP, или этой "гремучей смесью".

Это пока... пока PIP ставит пакеты из "pypi"...

А что будет, если PIP поставит пакет по имени, но с применением

--index-url

???????

Удалим "torch"

Conda видит остатки пакетов зависимостей от pip
Conda видит остатки пакетов зависимостей от pip

Как видим, PIP удалил сам torch, но оставил "фантики", которые были установлены как "нужны для torch", просто наплевав на них. Это — лишний мусор из ненужных пакетов, которые PIP все время оставляет за собой.

Сейчас установим torch-cuda версию торча, которой нет на "pypi":

pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124
Установлена torch-cuda версия торча
Установлена torch-cuda версия торча
list
list

Как видим, Cuda смогла увидеть только ИМЯ пакета из "dist-info", а вот URL пакеты ей недоступен!

Мне интересно, как поведет себя экспорт/импорт пакетов с помощью PIP, и с помощью Cuda, кто из них сможет восстановить "индекс-юрл".

Экспортируем и это, и то:

Экспорт
Экспорт

Вариант Cuda:

URL потерян!
URL потерян!

Вариант PIP:

URL потерян!
URL потерян!

Оба менеджера потеряли URL, хотя корректнее говорить "PIP потерял URL" потому, что для Conda - это не её пакет!

Поскольку при импорте такого списка команду на установку pip-пакетjd Conda отдаст самой PIP, то нам все равно, с помощью чего мы будем импортировать этот список. Я сделаю это с помощью Conda.

Изменим первую строку в YML-файле на "test2":

Изменили имя на "test2"
Изменили имя на "test2"

... и проведем импорт:

conda env create -f test.yml
pip сел в лужу
pip сел в лужу

Как и ожидалось, PIP "сел в лужу", поскольку при установке не сохранил значение внешнего репозитория с "pytorch", и стал искать пакет просто "по имени", а на "pypi" - там только "простой torch"!

Обратите внимание на ключ "-U" (--user), с которым Conda запустила PIP !!!

Это и есть "идеология" Conda - не дать никому вмешаться в глобальные пакеты, а разрешить PIP действовать только в пределах папки пользователя.

Но даже тут можно "подправить" YML-файл вот так вот:

Было:

-20

Стало:

-21

Я просто "подправил" строку установки так, как ее "скушает" PIP, поскольку в такой ситуации Conda просто "подсовывает" PIP-у эту строку.

Сейчас просто удалим папку "test2" в "env" (на уровне файлов) и повторим:

Не хочет...
Не хочет...

Одной строкой все три пакета не хочет...

Перепишем построчно:

Переписали построчно
Переписали построчно

Запустим:

Пролезло!!!
Пролезло!!!

Установилось!!!

pip list
conda list
Все встало
Все встало

Все встало, но с указанием на "pypi".

Так что и тут можно "залезть в сапогах на стол" и все подправить.

Если PIP сам принимает в строке список их нескольких пакетов при установке:

python -m pip install torch torchvision torchaudio

... то "в нотации Conda" их надо просто пописывать "по одному пакету на команду", и все.

Собственно, это (пока) все, что пока надо знать при установке пакетов PIP в Conda, и при "смеси" таких пакетов.

Теперь вы знаете, на что ориентироваться при одновременном использовании менеджеров PIP и Conda.

Моей личное (!) мнение:

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

Но мой выбор, все же - Conda!

Удачи!
NStor
https://t.me/stable_cascade_rus
https://t.me/srigert