анаконда обновить все возможные пакеты?

151

Я попробовал conda search --outdated, есть много устаревших пакетов, например, scipy 0.17.1, но последний 0.18.0. Тем не менее, когда я делаю conda update --all. Он не будет обновлять какие-либо пакеты.

обновление 1

conda update --all --alt-hint

Fetching package metadata .......
Solving package specifications: ..........

# All requested packages already installed.
# packages in environment at /home/user/opt/anaconda2:
#

обновление 2

Я могу обновить эти пакеты отдельно. Я могу сделать conda update scipy. Но почему я не могу обновить их все за один раз?

Ван
источник
2
Это может быть потому, что последний scipy имеет конфликтную зависимость. Например, это может потребовать NumPy 1.11, но у вас есть другой пакет, который требует NumPy 1.10. Вы можете попробовать conda update --all --alt-hintи посмотреть, дает ли это какой-либо вывод ... Или просто попробовать conda update scipyи посмотреть, что происходит (возможно, с --alt-hintфлагом)
darthbith
@darthbith, пожалуйста, обратитесь к обновлению 1. Нет полезной информации.
Ван
1
But why I cannot update all of them in one go?Возможно, потому что у вас есть по крайней мере один пакет, который зависит от более старой версии и, следовательно, ничего не может быть обновлено.
чел
Можно ли узнать, какой из них зависит от старых пакетов?
Ван
3
Я рекомендую бегать conda update condaраньшеconda update --all
gizzmole

Ответы:

230

TL; DR: конфликты зависимостей: Обновление одного требует (согласно его требованиям) понижения другого

Ты прав:

conda update --all

на самом деле путь 1 . Conda всегда пытается обновить пакеты до последней версии в серии (скажем, Python 2.x или 3.x).

Конфликты зависимостей

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

например, X требует Y <5.0, поэтому Y никогда не будет> = 5.0

Вот почему вы не можете обновить их все.

Разрешающая

Чтобы добавить: возможно, это могло бы работать, но более новая версия X, работающая с Y> 5.0, недоступна в conda. Возможна установка с помощью pip, поскольку в pip доступно больше пакетов. Но имейте в виду, что pip также устанавливает пакеты, если существуют конфликты зависимостей и что это обычно нарушает вашу среду conda в том смысле, что вы больше не можете надежно устанавливать с conda. Если вы сделаете это, сделайте это в крайнем случае и после того, как все пакеты были установлены с помощью conda. Это скорее взломать.

Безопасный способ, которым вы можете воспользоваться, - это добавить conda-forge в качестве канала при обновлении (добавить -c conda-forgeкак флаг) или любой другой канал, содержащий ваш пакет, если вам действительно нужна эта новая версия . Таким образом, conda также ищет в этих местах доступные пакеты.

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

X> 2.0 требует Y <5.0, X <2.0 требует Y> 5.0

Таким образом, обновление Y> 5.0 подразумевает снижение X до <2.0 и наоборот.

( это, конечно, педагогический пример, но в действительности он такой же, обычно только с более сложными и подчиненными зависимостями). )

Таким образом, вы все еще не можете обновить их все , выполнив обновления по отдельности; зависимости просто не могут быть удовлетворены, поэтому раньше или позже при обновлении будет произведено понижение версии уже обновленного пакета. Или нарушите совместимость пакетов (что вам обычно не нужно!), Что возможно только путем явного вызова ignore-dependencies и force -command. Но это только для того, чтобы разобраться с проблемами, определенно не для обычного пользователя!


1 Если вы действительно хотите обновить пакеты вашей установки, чего обычно нет . Команда, запускаемая в базовой среде, обновит пакеты в этом, но обычно вам следует работать с виртуальными средами ( conda create -n myenvи затем conda activate myenv). Выполнение conda update --allв такой среде обновит пакеты в этой среде. Однако, поскольку базовая среда также является средой, ответ применяется к обоим случаям одинаково.

Mayou36
источник
1
Если вы используете conda, не нарушайте окружение, когда перезаписываете pip! Если вы используете среду Data Science, НЕ устанавливайте pkgs изолированно, потому что вы с большей вероятностью, чем с pip, нарушите свою среду.
InLaw
1
Я согласен, использование pip делает работу conda более надежной. Я добавил это в ответ явно.
Mayou36
15

Чтобы ответить более точно на вопрос:

conda (которая является conda для миниконды как для Anaconda) обновляет все, кроме ТОЛЬКО в определенной версии пакета -> основной и вспомогательный. Это парадигма.

В документации вы найдете «ПРИМЕЧАНИЕ: Conda обновляется до самой высокой версии в своей серии, поэтому Python 2.7 обновляется до самой высокой из доступных в серии 2.x и до 3.6 обновлений до самой высокой из доступных в серии 3.x». доктор

Если Ван не приводит воспроизводимый пример, можно только помочь. Например, действительно ли это виртуальная среда, которую он хочет обновить, или Ван может получить то, что хочет?

conda update -n ENVIRONMENT --all

* ПОЖАЛУЙСТА, прочитайте документы перед выполнением "update --all"! Это не приводит к обновлению всех пакетов по своей природе. Поскольку conda пытается разрешить взаимосвязи зависимостей между всеми пакетами в вашей среде, это может привести к ВЫКЛЮЧЕННЫМ пакетам без предупреждений.


Если вы хотите обновить только почти все, вы можете создать пин-файл

echo "conda ==4.0.0" >> ~/miniconda3/envs/py35/conda-meta/pinned
echo "numpy 1.7.*" >> ~/miniconda3/envs/py35/conda-meta/pinned

перед запуском обновления.

Если позже вы захотите проигнорировать файл в вашем env для обновления, вы можете сделать:

conda update --all --no-pin

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

Первым шагом всегда должно быть резервное копирование вашей текущей спецификации:

conda list -n py35 --explicit 

(но даже в этом случае не всегда есть ссылка на доступный источник - как для расширений jupyterlab)

Далее вы можете клонировать и обновить:

conda create -n py356 --clone py35

conda activate py356
conda config --set pip_interop_enabled True # for conda>=4.6
conda update --all

Конда Конфиг


Обновить:

Поскольку идея conda хороша, но она не очень хорошо работает в сложных средах, я лично предпочитаю сочетание nix-shell (or lorri) and poetry[как превосходное pip / conda .-)] ( intro Стихи 2nix ).


Наконец, если вам действительно нужно работать с пакетами, которые несовместимы из-за его зависимостей, это возможно с такими технологиями, как NixOS / nix-pkgs .

По закону
источник
3
Этот ответ предполагает: 1. вы установили miniconda3 с именем и путем по умолчанию (а не, скажем, anaconda) 2. что вы создали среду «py35». Вы можете указать, что дальше, поскольку новички, на которых должен быть нацелен этот ответ (на мой взгляд), могут легко запутаться. Кроме того, вы, похоже, не совсем отвечаете на вопрос, так как это может все же не позволить ему обновить. И это его цель.
Mayou36
Конечно, позвольте мне спросить их по отдельности: а) «ТОЛЬКО в конкретной версии»: это относится к версии Python, а не к пакетам, верно? Или вы можете привести это, пожалуйста?
Mayou36
б) «В документации вы найдете [...]»: это явно относится к версии Python. Это не имеет ничего общего с вопросом, правильно? Или почему вы публикуете это? Насколько актуально это утверждение?
Mayou36
c) conda update -n ENVIRONMENT --all: Я согласен, что именно это он / она обычно хочет использовать, а не обновлять базовую среду. Однако я не нахожу в вашем ответе объяснения по этому поводу, он просто написан и не относится к разнице в использовании команды op в базовой среде.
Mayou36
г) «Если вы хотите обновить почти все, вы можете создать файл пин-кода»: это хорошая информация. Но это не то, о чем просил ОП. Он хочет знать, почему он не может обновить все . Он не хочет фиксировать версии. Так что это не добавляет к ответу, не так ли?
Mayou36
2

Представьте себе граф зависимостей пакетов, когда количество пакетов увеличивается, вероятность возникновения конфликта при обновлении / добавлении пакетов намного выше. Чтобы избежать этого, просто создайте новую среду в Анаконде.

Будьте скромны, устанавливайте только то, что вам нужно. Для меня я установил следующие пакеты в моей новой среде:

  • панд
  • scikit учиться
  • Matplotlib
  • ноутбук
  • keras

И у меня есть 84 пакета в общей сложности.

спектральный
источник
Это не отвечает на вопрос о том, как обновить конкретный пакет.
Mayou36
0

Если вы работаете в MS Windows, вы можете использовать Anaconda Navigator. нажмите на среду, в раскрывающемся списке, она "установлена" по умолчанию. Вы можете выбрать «обновляемый» и начать оттуда

Дэвид
источник
1
Но как выбрать все для обновления, когда их слишком много, чтобы выбрать по отдельности?
Бельдаз
@beldaz, я попытался «решить» это, выбрав все 141 пакет в последнем столбце с «Версия», а затем нажмите Применить. Не уверен, что это работает :(. Тогда я просто открыл консоль Anaconda, нажав <win> Anaconda Prompt
Pieter21
Запуск от имени администратора также может потребоваться
Pieter21
Это также не решит актуальную проблему, прочитайте принятый ответ о конфликтах зависимостей.
Mayou36
-1

Для обновления всех возможных пакетов я использовал conda update --update-all

Оно работает!

неин неин
источник
4
Нет, это не так: если вы перечитываете OP, возникают конфликты зависимостей. Этот ответ не решает и не объясняет ничего
Mayou36
-6

Я решил эту проблему с condaи pip.

Во-первых, я бегу:

conda uninstall qt and conda uninstall matplotlib and conda uninstall PyQt5

После этого я открыл cmd и запустил этот код, который

pip uninstall qt , pip uninstall matplotlib , pip uninstall PyQt5

Наконец, вы должны установить matplotlibв пипе этот код, которыйpip install matplotlib

Mantakeke
источник
6
Это даже не близко к тому, что хотел сделать ОП
user8408080