Conda remove удаляет больше пакетов, чем ожидалось - PullRequest
1 голос
/ 18 октября 2019

Упрощенный MWE => Предположим, у меня есть Anaconda и я делаю следующее:

conda create -n demo python=3.6
conda activate demo
conda install seaborn

Последняя команда устанавливает 39 новых пакетов, включая seaborn, matplotlib и pandas. Теперь предположим, что прошло время, и я продолжаю настраивать свою среду и хочу явно установить matplotlib и pandas:

conda install matplotlib pandas

Это говорит мне «Все запрошенные пакеты уже установлены», что нормально. Однако теперь, если я решу, что мне больше не нужен seaborn и удаляю его,

conda remove seaborn

это удалит ВСЕ 39 пакетов, которые были установлены при установке seaborn, включая matplotlib и pandas, который я после этого явно установил! Как я могу избежать этой проблемы?

Я ожидаю, что conda remove seaborn удаляет seaborn и все его зависимости, но не удаляет любой пакет (или его зависимости), которыйбыл явно установлен до или после seaborn. Некоторые могут сказать, просто удалить seaborn и все 39 пакетов, а затем вручную переустановить matplotlib и pandas. Это работает в тривиальных случаях, но как только есть, например, 25 пакетов со сложной взаимозависимостью, это становится очень сложным и, по крайней мере, полным неудобством для обслуживания.

Как конкретный пример этого, как я могу построитьполная среда Anaconda без определенного пакета и только пакетов, которые зависят от него? Я попытался:

conda create -n test python=3.6 anaconda
conda remove libtiff  # I want this to strictly only remove libtiff and its recursive dependents, but obviously this is not what happens

, но вторая строка удаляет практически все пакеты во всей среде, как и anaconda. Есть идеи?

1 Ответ

0 голосов
/ 19 октября 2019

Обходной путь

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

  1. Удалите только те пакеты, которые вам нужны:

    conda remove --force libtiff
    
  2. Запустите проверку непротиворечивости, чтобы получить список поврежденных пакетов:

    conda install -d python
    
  3. Если есть пакеты, то итерируйте (то есть удалите их с помощью шага 1);в противном случае все готово.

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

Экспорт полученного env:

conda env export -n my_env > env.yaml

Воссоздание env:

conda env remove -n my_env
conda env create -n my_env -f env.yaml

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

Комментарий

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

...