anaconda оновити всі можливі пакети?


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
Це може бути через те, що остання наука має суперечливу залежність. Наприклад, може знадобитися 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 також встановлює пакети, якщо існують конфлікти залежностей, і що це зазвичай порушує ваше середовище 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 і навпаки.

( це, звичайно, педагогічний приклад, але в дійсності це те саме, як правило, лише зі складнішими залежностями та субзалежностями )

Отже, ви все одно не можете їх оновити , роблячи оновлення окремо; залежності просто не задовольняються, тому раніше чи пізніше оновлення знову знизить вже оновлений пакет. Або порушити сумісність пакетів (яких зазвичай не хочеться!), Що можливо лише шляхом явного виклику ігнорних залежностей та примусової команди . Але це лише для того, щоб зламати ваші проблеми, безумовно, не звичайний користувач!


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


1
Якщо ви використовуєте conda, не порушуйте ваше середовище, коли ви перезаписуєте файл pip! Якщо ви використовуєте середовище Data Science, НЕ встановлюйте pkgs ізольовано, тому що ви, швидше за все, з Pip, щоб порушити ваше оточення.
InLaw

1
Я погоджуюсь, що використання pip змушує конда більше працювати надійно. Я це явно додав у відповідь.
Mayou36

15

Щоб відповісти точніше на питання:

conda (що є conda для miniconda, як для 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

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

Якщо пізніше ви хочете ігнорувати файл у вашій програмі для оновлення, ви можете зробити:

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 config


оновлення:

Оскільки ідея конди є приємною, але вона не дуже спрацьовує складні умови, я особисто віддаю перевагу комбінації nix-shell (or lorri) and poetry[як чудовий піп / конда .-)] ( введення поезії2nix ).


Нарешті, якщо вам дійсно потрібно працювати з пакетами, несумісними через її залежності, можливо, за допомогою таких технологій, як NixOS / nix-pkgs .


3
Ця відповідь передбачає: 1. Ви встановили miniconda3 з ім'ям за замовчуванням і шлях (а не, скажімо, анаконда) 2. що ви створили середовище "py35". Ви можете вказати, що далі, як початківці, на кого повинна відповідати ця відповідь (на мою думку), можна легко заплутатися. Крім того, ви не дуже відповідаєте на питання, оскільки це все ще не дозволяє йому оновити. І це його мета.
Mayou36

Звичайно, дозвольте запитати їх окремо: а) "ТОЛЬКО в межах конкретної версії": це стосується версії Python, а не пакетів, правда? Або ви можете це процитувати?
Mayou36

б) "У документації ви знайдете [...]": це чітко стосується версії Python. Це не має нічого спільного з питанням, правильно? Або чому ви це публікуєте? Наскільки ця заява актуальна?
Mayou36,

в) conda update -n ENVIRONMENT --all: Я згоден, що саме цим він / вона зазвичай хоче користуватися, а не оновлювати базове середовище. Однак я взагалі не знаходжу пояснення у вашій відповіді на це питання, воно просто написане і не посилається на різницю використання команди оперативної програми в базовому середовищі.
Mayou36,

г) "Якщо ви хочете лише оновити майже всі, ви можете створити файл шпильок": це приємна інформація. Але це не те, про що просив ОП. Він хоче знати, чому він не може оновити всіх . Він не хоче закріплювати версії. Отже, це не додає до відповіді, чи не так?
Mayou36,

2

Уявіть собі графік залежності пакетів, коли кількість пакунків зростає, ймовірність виникнення конфлікту при модернізації / додаванні пакунків набагато вище Щоб цього уникнути, просто створіть нове середовище в Анаконда.

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

  • панди
  • scikit-вчитися
  • matplotlib
  • зошит
  • керас

А в мене 84 пакети.


Це не відповідає на питання про те, як оновити певний пакет.
Mayou36

0

якщо ви працюєте у вікнах MS, ви можете використовувати навігатор Anaconda. натисніть на середовище, у спадному вікні воно "встановлено" за замовчуванням. Ви можете вибрати "оновлений" та почати звідти


1
Але як вибрати все для оновлення, коли їх занадто багато, щоб вибрати їх окремо?
beldaz

@beldaz, я спробував "вирішити" це, вибравши всі 141 пакунки в останньому стовпчику з "Версією", а потім натиснути Застосувати. Не впевнений, чи працює :(. Тоді я щойно відкрив консоль Anaconda, натиснувши <win>
Підказку

Запустити як адміністратора також може знадобитися
Pieter21

Це також не вирішить актуальну проблему, прочитайте прийняту відповідь про конфлікти залежностей.
Mayou36

-1

Для оновлення всіх можливих пакетів, які я використовував conda update --update-all

Це працює!


4
Ні, це "не": якщо ви перечитали ОП, виникають конфлікти залежностей. Ця відповідь нічого не вирішує і не пояснює
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 цим кодом, щоpip install matplotlib


6
Це навіть не близьке до того, що хотів зробити ОП
user8408080
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.