anaconda zaktualizować wszystkie możliwe pakiety?

151

Wypróbowałem conda search --outdated, jest wiele przestarzałych pakietów, na przykład scipy to 0.17.1, ale najnowszy to 0.18.0. Jednak kiedy robię conda update --all. Nie zaktualizuje żadnych pakietów.

aktualizacja 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:
#

aktualizacja 2

Mogę oddzielnie zaktualizować te pakiety. Mogę zrobić conda update scipy. Ale dlaczego nie mogę zaktualizować ich wszystkich za jednym razem?

Wang
źródło
2
Może to być spowodowane tym, że najnowszy scipy ma sprzeczną zależność. Na przykład może wymagać NumPy 1.11, ale masz inny pakiet, który wymaga NumPy 1.10. Możesz spróbować conda update --all --alt-hinti zobaczyć, czy daje jakieś wyjście ... Lub po prostu spróbuj conda update scipyi zobacz, co się stanie (być może z --alt-hintflagą)
darthbith
@darthbith proszę odnieść się do aktualizacji 1. Brak przydatnych informacji.
Wang
1
But why I cannot update all of them in one go?Prawdopodobnie dlatego, że masz co najmniej jeden pakiet, który zależy od starszej wersji i dlatego nie można niczego aktualizować.
cel
Czy można dowiedzieć się, który z nich zależy od starych pakietów?
Wang
3
Polecam bieganie conda update condawcześniejconda update --all
gizzmole

Odpowiedzi:

230

TL; DR: konflikty zależności: Aktualizacja jednego wymaga (zgodnie z wymaganiami) obniżenia wersji innego

Masz rację:

conda update --all

właściwie jest droga 1 . Conda zawsze próbuje zaktualizować pakiety do najnowszej wersji z serii (powiedzmy Python 2.x lub 3.x).

Konflikty zależności

Ale jest możliwe, że istnieją konflikty zależności (które uniemożliwiają dalszą aktualizację). Conda zwykle ostrzega bardzo wyraźnie, jeśli wystąpią.

np. X wymaga Y <5,0, więc Y nigdy nie będzie> = 5,0

Dlatego „nie można” ich wszystkich ulepszyć.

Rozwiązywanie

Dodam, że może to zadziała, ale nowsza wersja X działająca z Y> 5.0 nie jest dostępna w stanie conda. Możliwe jest zainstalowanie za pomocą pip, ponieważ więcej pakietów jest dostępnych w pip. Należy jednak pamiętać, że pip instaluje również pakiety, jeśli istnieją konflikty zależności i że zwykle psuje środowisko Conda w tym sensie, że nie można już niezawodnie zainstalować z Conda. Jeśli to zrobisz, zrób to w ostateczności i po zainstalowaniu wszystkich pakietów z conda. To raczej hack.

Bezpiecznym sposobem na wypróbowanie jest dodanie conda-forge jako kanału podczas aktualizacji (dodawanie -c conda-forgejako flaga) lub dowolnego innego kanału, który zawiera twój pakiet, jeśli naprawdę potrzebujesz tej nowej wersji . W ten sposób conda wyszukuje również w tych miejscach dostępne pakiety.

Biorąc pod uwagę twoją aktualizację : możesz zaktualizować je osobno, ale spowoduje to nie tylko aktualizację, ale także obniżenie wersji innego pakietu. Powiedzmy, aby dodać do powyższego przykładu:

X> 2.0 wymaga Y <5.0, X <2.0 wymaga Y> 5.0

Tak więc uaktualnienie Y> 5.0 oznacza obniżenie X do <2.0 i odwrotnie.

( jest to oczywiście przykład pedagogiczny, ale w rzeczywistości jest tak samo, zwykle z bardziej skomplikowanymi zależnościami i pod-zależnościami )

Więc nadal nie możesz ulepszyć ich wszystkich , wykonując aktualizacje oddzielnie; zależności są po prostu niezadowalające, więc wcześniej lub później aktualizacja spowoduje ponowne obniżenie wersji już zaktualizowanego pakietu. Lub zepsuj kompatybilność pakietów (czego zwykle nie chcesz!), Co jest możliwe tylko przez jawne wywołanie ignorowania zależności i wymuszenia polecenia. Ale to jest tylko do włamywania się poruszać kwestie, na pewno nie przypadek normalny użytkownik!


1 Jeśli faktycznie chcesz zaktualizować pakiety instalacji, czego zwykle nie robisz . Polecenie uruchomione w środowisku podstawowym zaktualizuje pakiety w tym, ale zwykle powinieneś pracować ze środowiskami wirtualnymi ( conda create -n myenva potem conda activate myenv). Wykonanie conda update --allw takim środowisku spowoduje zaktualizowanie pakietów w tym środowisku. Ponieważ jednak środowisko bazowe jest również środowiskiem, odpowiedź dotyczy obu przypadków w ten sam sposób.

Mayou36
źródło
1
Jeśli używasz conda, nie niszcz swojego środowiska podczas nadpisywania pip! Jeśli korzystasz ze środowiska Data Science, NIE instaluj izolowanych pakietów, ponieważ jest bardziej prawdopodobne, że pip spowoduje uszkodzenie środowiska.
InLaw
1
Zgadzam się, używanie pip sprawia, że ​​conda nie działa już niezawodnie. Dodałem to wprost do odpowiedzi.
Mayou 36
15

Aby dokładniej odpowiedzieć na pytanie:

conda (czyli conda dla minicondy tak samo jak dla Anacondy) aktualizuje wszystko, ale TYLKO w ramach określonej wersji pakietu -> major i minor. To jest paradygmat.

W dokumentacji znajdziesz „UWAGA: Aktualizacje Conda do najwyższej wersji w swojej serii, więc Python 2.7 aktualizuje się do najwyższej dostępnej w serii 2.x, a aktualizacje 3.6 do najwyższej dostępnej w serii 3.x”. doc

Jeśli Wang nie podaje powtarzalnego przykładu, można tylko pomóc. np. czy to naprawdę wirtualne środowisko, które chce zaktualizować, czy może Wang może dostać to, czego chce

conda update -n ENVIRONMENT --all

* PROSZĘ przeczytać dokumentację przed wykonaniem polecenia „update --all”! Z natury nie prowadzi to do aktualizacji wszystkich pakietów. Ponieważ conda próbuje rozwiązać relacje zależności między wszystkimi pakietami w twoim środowisku, może to prowadzić do DOWNGRADED pakietów bez ostrzeżeń.


Jeśli chcesz zaktualizować tylko prawie wszystkie, możesz utworzyć plik pin

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

przed uruchomieniem aktualizacji.

Jeśli później zechcesz zignorować plik w swoim env w celu aktualizacji, możesz wykonać:

conda update --all --no-pin

Nie powinieneś aktualizować - wszystko. Jeśli jednak jej potrzebujesz, możesz bezpiecznie przetestować to w sklonowanym środowisku.

Pierwszym krokiem zawsze powinno być wykonanie kopii zapasowej aktualnej specyfikacji:

conda list -n py35 --explicit 

(ale mimo to nie zawsze jest dostępny link do źródła - jak w przypadku rozszerzeń jupyterlab)

Następnie możesz sklonować i zaktualizować:

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


aktualizacja:

Ponieważ idea conda jest fajna, ale nie sprawdza się zbyt dobrze w złożonych środowiskach, osobiście wolę kombinację nix-shell (or lorri) and poetry[jako superior pip / conda .-)] ( intro poetry2nix ).


Wreszcie, jeśli naprawdę potrzebujesz pracować z pakietami, które nie są kompatybilne ze względu na ich zależności, jest to możliwe dzięki technologiom takim jak NixOS / nix-pkgs .

InLaw
źródło
3
Ta odpowiedź zakłada: 1. zainstalowałeś minicondę3 z domyślną nazwą i ścieżką (a nie, powiedzmy anaconda), 2. że stworzyłeś środowisko "py35". Możesz sprecyzować, że jako początkujący, do kogo ta odpowiedź powinna być skierowana (moim zdaniem), mogą się łatwo pomylić. Ponadto wydaje się, że tak naprawdę nie odpowiadasz na pytanie, ponieważ nadal może to uniemożliwić mu aktualizację. I to jest jego cel.
Mayou 36
Oczywiście pozwolę sobie zapytać ich indywidualnie: a) „TYLKO w ramach określonej wersji”: dotyczy to wersji Pythona, a nie pakietów, prawda? Czy możesz to zacytować?
Mayou36
b) „W dokumentacji znajdziesz […]”: odnosi się to wyraźnie do wersji Pythona. To nie ma nic wspólnego z pytaniem, prawda? Albo dlaczego to publikujesz? Jakie znaczenie ma to stwierdzenie?
Mayou36
c) conda update -n ENVIRONMENT --all: Zgadzam się, że zwykle tego chce używać, a nie aktualizować środowiska podstawowego. Jednak w Twojej odpowiedzi w ogóle nie znajduję wyjaśnienia na ten temat, jest po prostu napisana i nie odnosi się do różnicy w używaniu polecenia op w środowisku podstawowym.
Mayou36,
d) „Jeśli chcesz tylko zaktualizować prawie wszystko, możesz utworzyć plik pinów”: to fajna informacja. Ale nie o to prosił OP. On chce wiedzieć dlaczego nie może zaktualizować wszystkich . Nie chce przypinać wersji. Więc to nie dodaje odpowiedzi, prawda?
Mayou36
2

Wyobraź sobie wykres zależności pakietów, gdy liczba pakietów rośnie, prawdopodobieństwo wystąpienia konfliktu podczas aktualizacji / dodawania pakietów jest znacznie większe. Aby tego uniknąć, po prostu utwórz nowe środowisko w Anaconda.

Bądź oszczędny, instaluj tylko to, czego potrzebujesz. Dla mnie zainstalowałem następujące pakiety w moim nowym środowisku:

  • pandy
  • scikit-learn
  • matplotlib
  • notatnik
  • keras

W sumie mam 84 opakowania.

Widmowy
źródło
To nie odpowiada na pytanie, jak zaktualizować określony pakiet.
Mayou36,
0

jeśli pracujesz w systemie Windows, możesz użyć nawigatora Anaconda. kliknij środowisko, w menu rozwijanym jest domyślnie „zainstalowane”. Możesz wybrać opcję „do aktualizacji” i zacząć od tego miejsca

David
źródło
1
Ale jak wybrać wszystkie do aktualizacji, gdy jest ich zbyt wiele do wyboru indywidualnie?
beldaz
@beldaz, próbowałem go „rozwiązać”, zaznaczając wszystkie 141 pakietów w ostatniej kolumnie za pomocą „Wersja”, a następnie naciskając Zastosuj. Nie jestem pewien, czy to działa :(. Potem właśnie otworzyłem konsolę Anaconda, naciskając <win> Anaconda Prompt
Pieter21
Uruchom jako administrator może być również wymagany
Pieter21
To również nie rozwiąże rzeczywistego problemu, przeczytaj zaakceptowaną odpowiedź dotyczącą konfliktów zależności.
Mayou36
-1

Aby zaktualizować wszystkie możliwe pakiety, których użyłem conda update --update-all

To działa!

nein nein
źródło
4
Nie, „nie”: jeśli ponownie przeczytasz OP, napotkasz konflikty zależności. Ta odpowiedź niczego nie rozwiązuje ani nie wyjaśnia
Mayou36
-6

Rozwiązałem ten problem za pomocą condaipip .

Po pierwsze biegam:

conda uninstall qt and conda uninstall matplotlib and conda uninstall PyQt5

Następnie otworzyłem cmd i uruchomiłem ten kod

pip uninstall qt , pip uninstall matplotlib , pip uninstall PyQt5

Na koniec powinieneś zainstalować matplotlibw pip za pomocą tego kodupip install matplotlib

Mantakeke
źródło
6
Nie jest to nawet bliskie temu, co chciał zrobić OP
użytkownik8408080