anaconda mettre à jour tous les packages possibles?

151

J'ai essayé le conda search --outdated, il y a beaucoup de paquets obsolètes, par exemple le scipy est 0.17.1 mais le dernier est 0.18.0. Cependant, quand je fais le conda update --all. Il ne mettra à jour aucun paquet.

mise à jour 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:
#

mise à jour 2

Je peux mettre à jour ces packages séparément. Je peux faire conda update scipy. Mais pourquoi je ne peux pas tous les mettre à jour en une seule fois?

Wang
la source
2
Cela peut être dû au fait que le dernier scipy a une dépendance conflictuelle. Par exemple, il peut nécessiter NumPy 1.11, mais vous avez un package différent qui nécessite NumPy 1.10. Vous pouvez essayer de conda update --all --alt-hintvoir si cela donne une sortie ... Ou simplement essayer de conda update scipyvoir ce qui se passe (peut-être avec le --alt-hintdrapeau)
darthbith
@darthbith veuillez vous référer à la mise à jour 1. Aucune information utile.
Wang
1
But why I cannot update all of them in one go?Probablement parce que vous avez au moins un package qui dépend d'une version plus ancienne et que rien ne peut donc être mis à jour.
cel
Est-il possible de savoir lequel dépend d'anciens packages?
Wang
3
Je recommande de courir conda update condaavantconda update --all
gizzmole

Réponses:

230

TL; DR: conflits de dépendance: la mise à jour de l'un nécessite (par ses exigences) de rétrograder un autre

Vous avez raison:

conda update --all

est en fait la voie à suivre 1 . Conda essaie toujours de mettre à niveau les packages vers la dernière version de la série (par exemple Python 2.x ou 3.x).

Conflits de dépendance

Mais il est possible qu'il y ait des conflits de dépendances (qui empêchent une nouvelle mise à niveau). Conda avertit généralement très explicitement s'ils se produisent.

par exemple, X nécessite Y <5,0, donc Y ne sera jamais> = 5,0

C'est pourquoi vous ne pouvez pas tous les mettre à niveau.

Résoudre

Pour ajouter: peut-être que cela pourrait fonctionner mais une version plus récente de X fonctionnant avec Y> 5.0 n'est pas disponible dans conda. Il est possible d'installer avec pip, car plus de packages sont disponibles dans pip. Mais sachez que pip installe également des packages si des conflits de dépendances existent et qu'il rompt généralement votre environnement conda dans le sens où vous ne pouvez plus installer de manière fiable avec conda. Si vous faites cela, faites-le en dernier recours et après que tous les paquets ont été installés avec conda. C'est plutôt un hack.

Un moyen sûr que vous pouvez essayer est d'ajouter conda-forge comme canal lors de la mise à niveau (ajouter -c conda-forgecomme indicateur) ou tout autre canal que vous trouvez contenant votre paquet si vous avez vraiment besoin de cette nouvelle version . De cette façon, conda recherche également dans ces endroits les packages disponibles.

Compte tenu de votre mise à jour : vous pouvez les mettre à niveau chacun séparément, mais cela n'inclura pas seulement une mise à niveau, mais également une rétrogradation d'un autre package. Dites, pour ajouter à l'exemple ci-dessus:

X> 2.0 nécessite Y <5.0, X <2.0 nécessite Y> 5.0

Donc, la mise à niveau de Y> 5.0 implique de rétrograder X à <2.0 et vice versa.

( ceci est un exemple pédagogique, bien sûr, mais c'est la même chose en réalité, généralement juste avec des dépendances et sous-dépendances plus compliquées )

Vous ne pouvez donc toujours pas tous les mettre à niveau en effectuant les mises à niveau séparément; les dépendances ne sont tout simplement pas satisfaisables, donc plus tôt ou plus tard, une mise à niveau rétrogradera à nouveau un paquet déjà mis à niveau. Ou interrompez la compatibilité des packages (ce que vous ne voulez généralement pas!), Ce qui n'est possible qu'en invoquant explicitement une commande ignore-dependencies et force . Mais ce n'est de pirater votre chemin autour des questions, certainement pas le cas normal utilisateur!


1 Si vous souhaitez réellement mettre à jour les packages de votre installation, ce que vous ne faites généralement pas . La commande exécutée dans l'environnement de base mettra à jour les packages dans ce domaine, mais vous devez généralement travailler avec des environnements virtuels ( conda create -n myenvet ensuite conda activate myenv). L'exécution conda update --alldans un tel environnement mettra à jour les packages dans cet environnement. Cependant, puisque l'environnement de base est également un environnement, la réponse s'applique aux deux cas de la même manière.

Mayou36
la source
1
Si vous utilisez conda, ne cassez pas votre environnement lorsque vous écrasez avec pip! Si vous utilisez un environnement Data Science, N'installez PAS de paquets isolés car vous êtes plus susceptible de casser votre env avec pip.
InLaw
1
Je suis d'accord, l'utilisation de pip fait que conda ne fonctionne plus de manière fiable. J'ai ajouté ceci dans la réponse explicitement.
Mayou36
15

Pour répondre plus précisément à la question:

conda (qui est conda pour miniconda comme pour Anaconda) met à jour tout sauf UNIQUEMENT dans une version spécifique d'un paquet -> majeur et mineur. Voilà le paradigme.

Dans la documentation, vous trouverez "REMARQUE: Conda met à jour la version la plus élevée de sa série, donc Python 2.7 met à jour la plus élevée disponible dans la série 2.x et 3.6 met à jour la plus haute disponible dans la série 3.x". doc

Si Wang ne donne pas d'exemple reproductible, on ne peut que l'aider. par exemple, est-ce vraiment l'environnement virtuel qu'il veut mettre à jour ou Wang pourrait-il obtenir ce qu'il veut?

conda update -n ENVIRONMENT --all

* VEUILLEZ lire la documentation avant d'exécuter "update --all"! Cela ne conduit pas à une mise à jour de tous les packages par nature. Parce que conda essaie de résoudre la relation de dépendances entre tous les packages de votre environnement, cela peut conduire à des packages DOWNGRADED sans avertissement.


Si vous souhaitez uniquement mettre à jour presque tout, vous pouvez créer un fichier PIN

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

avant d'exécuter la mise à jour.

Si plus tard vous souhaitez ignorer le fichier dans votre environnement pour une mise à jour, vous pouvez faire:

conda update --all --no-pin

Vous ne devez pas mettre à jour --all. Si vous en avez besoin, vous pouvez le tester dans un environnement cloné.

La première étape devrait toujours être de sauvegarder votre spécification actuelle:

conda list -n py35 --explicit 

(mais même ainsi il n'y a pas toujours de lien vers la source disponible - comme pour les extensions jupyterlab)

Ensuite, vous pouvez cloner et mettre à jour:

conda create -n py356 --clone py35

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

config conda


mettre à jour:

Parce que l'idée de conda est agréable mais qu'elle ne fonctionne pas très bien pour des environnements complexes, je préfère personnellement la combinaison de nix-shell (or lorri) and poetry[as superior pip / conda .-)] ( intro poetry2nix ).


Enfin, si vous avez vraiment besoin de travailler avec des packages qui ne sont pas compatibles en raison de ses dépendances, c'est possible avec des technologies comme NixOS / nix-pkgs .

En loi
la source
3
Cette réponse suppose: 1. que vous avez installé miniconda3 avec le nom et le chemin par défaut (et non, disons anaconda) 2. que vous avez créé un environnement "py35". Vous pouvez spécifier qu'en tant que débutants, à qui cette réponse devrait être ciblée (à mon avis), peut facilement devenir confus. De plus, vous ne répondez pas vraiment à la question, car cela ne lui permet toujours pas de se mettre à niveau. Et c'est son objectif.
Mayou36
Bien sûr, permettez-moi de leur demander individuellement: a) "UNIQUEMENT dans une version spécifique": cela fait référence à la version Python, pas aux packages, non? Ou pouvez-vous citer ceci s'il vous plaît?
Mayou36
b) "Dans la documentation que vous trouverez [...]": cela fait clairement référence à la version Python. Cela n'a rien à voir avec la question, n'est-ce pas? Ou pourquoi publiez-vous ceci? En quoi cette déclaration est-elle pertinente?
Mayou36
c) conda update -n ENVIRONMENT --all: Je reconnais que c'est ce qu'il / elle souhaite généralement utiliser, pas pour mettre à jour l'environnement de base. Cependant, je ne trouve aucune explication dans votre réponse à ce sujet, elle est juste écrite et ne fait pas référence à la différence d'utiliser la commande de l'op dans l'environnement de base.
Mayou36
d) "Si vous voulez seulement mettre à jour presque tout, vous pouvez créer un fichier pin": c'est une information intéressante. Mais ce n'est pas ce qu'OP a demandé. Il veut savoir pourquoi il ne peut pas tout mettre à jour . Il ne veut pas épingler les versions. Cela n'ajoute donc rien à la réponse, n'est-ce pas?
Mayou36
2

Imaginez le graphique de dépendance des packages, lorsque le nombre de packages augmente, le risque de rencontrer un conflit lors de la mise à niveau / ajout de packages est beaucoup plus élevé. Pour éviter cela, créez simplement un nouvel environnement dans Anaconda.

Soyez économe, installez uniquement ce dont vous avez besoin. Pour moi, j'ai installé les packages suivants dans mon nouvel environnement:

  • pandas
  • scikit-learn
  • matplotlib
  • carnet
  • Keras

Et j'ai 84 colis au total.

Spectral
la source
Cela ne répond pas à la question de savoir comment mettre à niveau un package spécifique.
Mayou36
0

si vous travaillez dans MS Windows, vous pouvez utiliser le navigateur Anaconda. cliquez sur l'environnement, dans la liste déroulante, il est "installé" par défaut. Vous pouvez sélectionner «modifiable» et commencer à partir de là

David
la source
1
Mais comment sélectionner tout pour mettre à jour quand il y en a trop pour sélectionner individuellement?
beldaz
@beldaz, j'ai essayé de le «résoudre» en sélectionnant les 141 paquets dans la dernière colonne avec «Version», puis en appuyant sur Appliquer. Je ne sais pas si cela fonctionne :(. Ensuite, je viens d'ouvrir la console Anaconda en appuyant sur <win> Invite Anaconda
Pieter21
Exécuter en tant qu'administrateur peut également être requis
Pieter21
Cela ne résoudra pas non plus le problème réel, lisez la réponse acceptée sur les conflits de dépendances.
Mayou36
-1

Pour mettre à jour tous les packages possibles que j'ai utilisés conda update --update-all

Ça marche!

nein nein
la source
4
Non, ce n'est "pas": si vous relisez l'OP, des conflits de dépendances sont rencontrés. Cette réponse ne résout ni n'explique rien
Mayou36
-6

J'ai résolu ce problème avec condaet pip.

Tout d'abord, je lance:

conda uninstall qt and conda uninstall matplotlib and conda uninstall PyQt5

Après cela, j'ai ouvert la cmd et exécutez ce code qui

pip uninstall qt , pip uninstall matplotlib , pip uninstall PyQt5

Enfin, vous devez installer matplotlibdans pip par ce code quipip install matplotlib

Mantakeke
la source
6
Ce n'est même pas proche de ce que OP voulait faire
user8408080