Anaconda alle möglichen Pakete aktualisieren?

149

Ich habe das ausprobiert conda search --outdated, es gibt viele veraltete Pakete, zum Beispiel ist der Scipy 0.17.1, aber der neueste ist 0.18.0. Wenn ich das mache conda update --all. Es werden keine Pakete aktualisiert.

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

Update 2

Ich kann diese Pakete separat aktualisieren. Ich kann tun conda update scipy. Aber warum kann ich nicht alle auf einmal aktualisieren?

Wang
quelle
2
Dies kann daran liegen, dass der neueste Scipy eine widersprüchliche Abhängigkeit aufweist. Beispielsweise ist möglicherweise NumPy 1.11 erforderlich, Sie haben jedoch ein anderes Paket, für das NumPy 1.10 erforderlich ist. Sie können versuchen, zu conda update --all --alt-hintsehen, ob es eine Ausgabe gibt ... Oder versuchen Sie einfach zu conda update scipysehen, was passiert (vielleicht mit der --alt-hintFlagge)
Darthbith
@darthbith siehe Update 1. Keine nützlichen Infos.
Wang
1
But why I cannot update all of them in one go?Wahrscheinlich, weil Sie mindestens ein Paket haben, das von einer älteren Version abhängt und daher nichts aktualisiert werden kann.
Cel
Kann man herausfinden, welches von alten Paketen abhängt?
Wang
3
Ich empfehle , läuft conda update condavorconda update --all
gizzmole

Antworten:

230

TL; DR: Abhängigkeitskonflikte: Für die Aktualisierung eines Konflikts muss (aufgrund seiner Anforderungen) ein anderer heruntergestuft werden

Du hast recht:

conda update --all

ist eigentlich der richtige Weg 1 . Conda versucht immer, die Pakete auf die neueste Version der Serie zu aktualisieren (z. B. Python 2.x oder 3.x).

Abhängigkeitskonflikte

Es ist jedoch möglich, dass es Abhängigkeitskonflikte gibt (die ein weiteres Upgrade verhindern). Conda warnt normalerweise sehr explizit, wenn sie auftreten.

zB X erfordert Y <5,0, also wird Y niemals> = 5,0 sein

Deshalb können Sie nicht alle aktualisieren.

Lösung

Zum Hinzufügen: Vielleicht könnte es funktionieren, aber eine neuere Version von X, die mit Y> 5.0 arbeitet, ist in conda nicht verfügbar. Es ist möglich, mit pip zu installieren, da mehr Pakete in pip verfügbar sind. Beachten Sie jedoch, dass pip auch Pakete installiert, wenn Abhängigkeitskonflikte bestehen, und dass dies normalerweise Ihre Conda-Umgebung in dem Sinne zerstört, dass Sie mit Conda nicht mehr zuverlässig installieren können. Wenn Sie dies tun, tun Sie dies als letzten Ausweg und nachdem alle Pakete mit conda installiert wurden. Es ist eher ein Hack.

Ein sicherer Weg, den Sie versuchen können, ist das Hinzufügen von conda-forge als Kanal beim Upgrade (Hinzufügen -c conda-forgeals Flag) oder eines anderen Kanals, der Ihr Paket enthält, wenn Sie diese neue Version wirklich benötigen . Auf diese Weise sucht conda auch an diesen Stellen nach verfügbaren Paketen.

Berücksichtigen Sie Ihr Update : Sie können sie jeweils einzeln aktualisieren. Dazu gehört jedoch nicht nur ein Upgrade, sondern auch ein Downgrade eines anderen Pakets. Zum obigen Beispiel hinzufügen:

X> 2.0 erfordert Y <5.0, X <2.0 erfordert Y> 5.0

Ein Upgrade von Y> 5.0 bedeutet also ein Downgrade von X auf <2.0 und umgekehrt.

( Dies ist natürlich ein pädagogisches Beispiel, aber in Wirklichkeit ist es dasselbe, normalerweise nur mit komplizierteren Abhängigkeiten und Unterabhängigkeiten. )

Sie können also immer noch nicht alle aktualisieren , indem Sie die Upgrades separat durchführen. Die Abhängigkeiten sind einfach nicht zufriedenstellend, so dass früher oder später ein Upgrade ein bereits aktualisiertes Paket erneut herunterstufen wird. Oder brechen Sie die Kompatibilität der Pakete (die Sie normalerweise nicht wollen!), Was nur durch explizites Aufrufen eines Ignorier-Abhängigkeits- und Force- Befehls möglich ist. Aber das ist nur hacken Sie Ihren Weg um Probleme, auf jeden Fall nicht die normale Benutzer Fall!


1 Wenn Sie die Pakete Ihrer Installation tatsächlich aktualisieren möchten, was normalerweise nicht der Fall ist . Der in der Basisumgebung ausgeführte Befehl aktualisiert die darin enthaltenen Pakete. In der Regel sollten Sie jedoch ( conda create -n myenvund dann conda activate myenv) mit virtuellen Umgebungen arbeiten . Durch Ausführen conda update --allin einer solchen Umgebung werden die Pakete in dieser Umgebung aktualisiert . Da die Basisumgebung jedoch auch eine Umgebung ist, gilt die Antwort für beide Fälle auf die gleiche Weise.

Mayou36
quelle
1
Wenn Sie conda verwenden, brechen Sie nicht Ihre Umgebung, wenn Sie mit pip überschreiben! Wenn Sie eine Data Science-Umgebung verwenden, installieren Sie pkgs NICHT isoliert, da Sie mit größerer Wahrscheinlichkeit als mit pip Ihre Umgebung beschädigen.
InLaw
1
Ich bin damit einverstanden, dass die Verwendung von Pip dazu führt, dass Conda nicht mehr zuverlässig funktioniert. Ich habe dies explizit in die Antwort aufgenommen.
Mayou36
14

Um die Frage genauer zu beantworten:

conda (was für miniconda wie für Anaconda conda ist) aktualisiert alle bis auf NUR innerhalb einer bestimmten Version eines Pakets -> Dur und Moll. Das ist das Paradigma.

In der Dokumentation finden Sie "HINWEIS: Conda wird auf die höchste Version seiner Serie aktualisiert, sodass Python 2.7 auf die höchste verfügbare Version in der 2.x-Serie und 3.6 auf die höchste verfügbare Version in der 3.x-Serie aktualisiert wird." doc

Wenn Wang kein reproduzierbares Beispiel gibt, kann man nur helfen. Ist es beispielsweise wirklich die virtuelle Umgebung, die er aktualisieren möchte, oder könnte Wang das bekommen, womit er / sie es möchte?

conda update -n ENVIRONMENT --all

* BITTE lesen Sie die Dokumente, bevor Sie "update --all" ausführen! Dies führt nicht zu einer Aktualisierung aller Pakete von Natur aus. Da conda versucht, die Abhängigkeitsbeziehung zwischen allen Paketen in Ihrer Umgebung aufzulösen, kann dies ohne Warnungen zu DOWNGRADED-Paketen führen.


Wenn Sie nur fast alle aktualisieren möchten, können Sie eine PIN-Datei erstellen

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

bevor Sie das Update ausführen.

Wenn Sie später die Datei in Ihrer Umgebung für ein Update ignorieren möchten, können Sie Folgendes tun:

conda update --all --no-pin

Sie sollten --all nicht aktualisieren. Wenn Sie es dennoch benötigen, sparen Sie es, dies in einer geklonten Umgebung zu testen.

Der erste Schritt sollte immer darin bestehen, Ihre aktuelle Spezifikation zu sichern:

conda list -n py35 --explicit 

(Trotzdem ist nicht immer ein Link zur Quelle verfügbar - wie bei jupyterlab-Erweiterungen)

Als nächstes können Sie klonen und aktualisieren:

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


aktualisieren:

Da die Idee von conda nett ist, aber für komplexe Umgebungen nicht sehr gut funktioniert, bevorzuge ich persönlich die Kombination von nix-shell (or lorri) and poetry[als überlegenes pip / conda .-)] ( Intro Poetry2nix ).


Wenn Sie wirklich mit Paketen arbeiten müssen, die aufgrund ihrer Abhängigkeiten nicht kompatibel sind, ist dies mit Technologien wie NixOS / nix-pkgs möglich .

Vor dem Gesetz
quelle
3
Diese Antwort setzt Folgendes voraus: 1. Sie haben miniconda3 mit dem Standardnamen und -pfad installiert (und nicht anaconda). 2. Sie haben eine Umgebung "py35" erstellt. Sie können angeben, dass Anfänger, auf die diese Antwort (meiner Meinung nach) gerichtet sein sollte, leicht verwirrt werden können. Außerdem müssen Sie die Frage nicht wirklich beantworten, da er dadurch möglicherweise immer noch kein Upgrade durchführen kann. Und das ist sein Ziel.
Mayou36
Lassen Sie mich sie natürlich einzeln fragen: a) "NUR innerhalb einer bestimmten Version": Dies bezieht sich auf die Python-Version, nicht auf Pakete, oder? Oder können Sie das bitte zitieren?
Mayou36
b) "In der Dokumentation finden Sie [...]": Dies bezieht sich eindeutig auf die Python-Version. Es hat nichts mit der Frage zu tun, richtig? Oder warum postest du das? Wie ist diese Aussage relevant?
Mayou36
c) conda update -n ENVIRONMENT --all: Ich stimme zu, dass dies das ist, was er / sie normalerweise verwenden möchte, nicht um die Basisumgebung zu aktualisieren. Ich finde jedoch überhaupt keine Erklärung in Ihrer Antwort dazu, sie ist nur geschrieben und bezieht sich nicht auf den Unterschied bei der Verwendung des Befehls op in der Basisumgebung.
Mayou36
d) "Wenn Sie nur fast alle aktualisieren möchten, können Sie eine PIN-Datei erstellen": Dies ist eine nette Information. Aber es ist nicht das, wonach OP gefragt hat. Er möchte wissen, warum er nicht alle aktualisieren kann . Er will keine Versionen festlegen. Es trägt also nicht zur Antwort bei, oder?
Mayou36
2

Stellen Sie sich das Abhängigkeitsdiagramm von Paketen vor: Wenn die Anzahl der Pakete größer wird, ist die Wahrscheinlichkeit eines Konflikts beim Aktualisieren / Hinzufügen von Paketen viel höher. Um dies zu vermeiden, erstellen Sie einfach eine neue Umgebung in Anaconda.

Seien Sie sparsam, installieren Sie nur das, was Sie brauchen. Für mich habe ich die folgenden Pakete in meiner neuen Umgebung installiert:

  • Pandas
  • scikit-lernen
  • matplotlib
  • Notizbuch
  • Keras

Und ich habe insgesamt 84 Pakete.

Spektral
quelle
Dies beantwortet nicht die Frage, wie ein bestimmtes Paket aktualisiert werden soll.
Mayou36
0

Wenn Sie in MS Windows arbeiten, können Sie den Anaconda Navigator verwenden. Klicken Sie auf die Umgebung. Im Dropdown-Feld ist sie standardmäßig "installiert". Sie können "aktualisierbar" auswählen und von dort aus starten

David
quelle
1
Aber wie wählt man alle aus, die aktualisiert werden sollen, wenn zu viele vorhanden sind, um sie einzeln auszuwählen?
Beldaz
@beldaz, ich habe versucht, es zu lösen, indem ich alle 141 Pakete in der letzten Spalte mit 'Version' ausgewählt und dann auf Übernehmen geklickt habe. Ich bin mir nicht sicher, ob es funktioniert :(. Dann habe ich die Anaconda-Konsole durch Drücken von <win> Anaconda Prompt
Pieter21,
Als
Administrator ausführen
Dies wird auch das eigentliche Problem nicht lösen. Lesen Sie die akzeptierte Antwort zu Abhängigkeitskonflikten.
Mayou36
-1

Um alle möglichen Pakete zu aktualisieren, die ich verwendet habe conda update --update-all

Es klappt!

nein nein
quelle
4
Nein, dies ist nicht der Fall: Wenn Sie das OP erneut lesen, treten Abhängigkeitskonflikte auf. Diese Antwort löst oder erklärt nichts
Mayou36
-6

Ich habe dieses Problem mit condaund gelöst pip.

Erstens renne ich:

conda uninstall qt and conda uninstall matplotlib and conda uninstall PyQt5

Danach habe ich das cmd geöffnet und diesen Code ausgeführt

pip uninstall qt , pip uninstall matplotlib , pip uninstall PyQt5

Zuletzt sollten Sie matplotlibin pip nach diesem Code das installierenpip install matplotlib

Mantakeke
quelle
6
Dies ist nicht einmal in der Nähe von dem, was OP tun wollte
user8408080