anaconda aggiorna tutti i pacchetti possibili?


151

Ho provato il conda search --outdated , ci sono molti pacchetti obsoleti, ad esempio lo scipy è 0.17.1 ma l'ultimo è 0.18.0. Tuttavia, quando faccio il conda update --all. Non aggiornerà alcun pacchetto.

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

aggiornamento 2

Posso aggiornare quei pacchetti separatamente. Posso fare conda update scipy. Ma perché non riesco ad aggiornarli tutti in una volta sola?


2
Forse perché l'ultimo scipy ha una dipendenza contrastante. Ad esempio, potrebbe richiedere NumPy 1.11, ma hai un pacchetto diverso che richiede NumPy 1.10. Puoi provare a conda update --all --alt-hintvedere se dà qualche output ... O semplicemente provare a conda update scipyvedere cosa succede (forse con la --alt-hintbandiera)
darthbith

@darthbith, fare riferimento all'aggiornamento 1. Nessuna informazione utile.
Wang,

1
But why I cannot update all of them in one go?Probabilmente perché hai almeno un pacchetto che dipende da una versione precedente e quindi nulla può essere aggiornato.
cel

È possibile scoprire quale dipende dai vecchi pacchetti?
Wang,

3
Consiglio di correre conda update condaprimaconda update --all
gizzmole il

Risposte:


230

TL; DR: conflitti di dipendenza: l' aggiornamento è necessario (in base ai requisiti) downgrade di un altro

Hai ragione:

conda update --all

è in realtà la strada da percorrere 1 . Conda cerca sempre di aggiornare i pacchetti alla versione più recente della serie (diciamo Python 2.xo 3.x).

Conflitti di dipendenza

Ma è possibile che ci siano conflitti di dipendenza (che impediscono un ulteriore aggiornamento). Conda di solito avverte in modo molto esplicito se si verificano.

ad es. X richiede Y <5.0, quindi Y non sarà mai> = 5.0

Ecco perché non puoi "aggiornarli" tutti.

Risoluzione

Per aggiungere: forse potrebbe funzionare, ma una versione più recente di X che funziona con Y> 5.0 non è disponibile in conda. È possibile installare con pip, poiché più pacchetti sono disponibili in pip. Ma tieni presente che pip installa anche pacchetti se esistono conflitti di dipendenza e che di solito rompe l'ambiente conda, nel senso che non puoi più installare in modo affidabile con conda. Se lo fai, fallo come ultima risorsa e dopo che tutti i pacchetti sono stati installati con conda. È piuttosto un trucco.

Un modo sicuro che puoi provare è aggiungere conda-forge come canale durante l'aggiornamento (aggiungi -c conda-forgecome flag) o qualsiasi altro canale che trovi che contiene il tuo pacchetto se hai davvero bisogno di questa nuova versione . In questo modo conda cerca anche in questi posti i pacchetti disponibili.

Considerando il tuo aggiornamento : puoi aggiornarli separatamente, ma ciò includerà non solo un aggiornamento, ma anche un downgrade di un altro pacchetto. Di ', per aggiungere all'esempio sopra:

X> 2.0 richiede Y <5.0, X <2.0 richiede Y> 5.0

Quindi l'aggiornamento di Y> 5.0 implica il downgrade di X a <2.0 e viceversa.

( questo è un esempio pedagogico, ovviamente, ma è lo stesso nella realtà, di solito solo con dipendenze e sottodipendenze più complicate )

Quindi non è ancora possibile aggiornarli tutti eseguendo gli aggiornamenti separatamente; le dipendenze non sono soddisfacenti, quindi prima o poi, un upgrade eseguirà nuovamente il downgrade di un pacchetto già aggiornato. Oppure rompi la compatibilità dei pacchetti (che di solito non vuoi!), Che è possibile solo invocando esplicitamente un comando ignore-dependencies e force- command. Ma questo è solo per incidere il modo per aggirare i problemi, sicuramente non è il caso normale utente!


1 Se si desidera effettivamente aggiornare i pacchetti dell'installazione, cosa che normalmente non si verifica . Il comando eseguito nell'ambiente di base aggiornerà i pacchetti in questo, ma di solito dovresti lavorare con ambienti virtuali ( conda create -n myenve quindi conda activate myenv). L'esecuzione conda update --allall'interno di tale ambiente aggiornerà i pacchetti all'interno di questo ambiente. Tuttavia, poiché anche l'ambiente di base è un ambiente, la risposta si applica ad entrambi i casi allo stesso modo.


1
Se stai usando conda non rompere il tuo ambiente quando si sovrascrive con pip! Se stai utilizzando un ambiente di Data Science NON installare pkgs isolati perché è più probabile che con pip rompa il tuo ambiente.
InLaw,

1
Sono d'accordo, l'uso di pip rende la conda non funziona più in modo affidabile. L'ho aggiunto esplicitamente alla risposta.
Mayou36,

15

Per rispondere più precisamente alla domanda:

conda (che è conda per miniconda come per Anaconda) si aggiorna quasi esclusivamente all'interno di una versione specifica di un pacchetto -> maggiore e minore. Questo è il paradigma.

Nella documentazione troverai "NOTA: Conda aggiorna alla versione più alta della sua serie, quindi Python 2.7 aggiorna alla versione più alta disponibile nella serie 2.x e 3.6 alla versione più alta disponibile nella serie 3.x". doc

Se Wang non fornisce un esempio riproducibile, si può solo aiutare. ad esempio, è davvero l'ambiente virtuale che vuole aggiornare o Wang potrebbe ottenere ciò che desidera

conda update -n ENVIRONMENT --all

* PER FAVORE leggi i documenti prima di eseguire "update --all"! Questo non porta ad un aggiornamento di tutti i pacchetti per natura. Poiché conda tenta di risolvere la relazione di dipendenze tra tutti i pacchetti nel proprio ambiente, ciò può portare a pacchetti DOWNGRADED senza avvisi.


Se vuoi solo aggiornare quasi tutto, puoi creare un file pin

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

prima di eseguire l'aggiornamento.

Se in seguito desideri ignorare il file nel tuo env per un aggiornamento, puoi fare:

conda update --all --no-pin

Non dovresti aggiornare - tutti. Se ne hai bisogno, tuttavia, puoi risparmiare questo test in un ambiente clonato.

Il primo passo dovrebbe sempre essere il backup delle specifiche correnti:

conda list -n py35 --explicit 

(ma anche così non c'è sempre un collegamento alla fonte disponibile - come per le estensioni jupyterlab)

Successivamente è possibile clonare e aggiornare:

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


aggiornare:

Perché l'idea di conda è piacevole ma non funziona molto bene per ambienti complessi, personalmente preferisco la combinazione di nix-shell (or lorri) and poetry[come pip / conda superiore .-)] ( intro poetry2nix ).


Infine, se hai davvero bisogno di lavorare con pacchetti non compatibili a causa delle sue dipendenze, è possibile con tecnologie come NixOS / nix-pkgs .


3
Questa risposta presuppone: 1. hai installato miniconda3 con il nome e il percorso predefiniti (e non, diciamo anaconda) 2. che hai creato un ambiente "py35". È possibile specificare che ulteriormente come principianti, a cui questa risposta dovrebbe essere mirata (a mio avviso), può essere facilmente confuso. Inoltre non Seam realmente di rispondere alla domanda, in quanto ciò potrebbe ancora non permettergli di aggiornamento. E quello è il suo obiettivo.
Mayou36,

Certo, lascia che glielo chieda individualmente: a) "SOLO all'interno di una versione specifica": si riferisce alla versione di Python, non ai pacchetti, giusto? O puoi citare questo per favore?
Mayou36

b) "Nella documentazione troverai [...]": si riferisce chiaramente alla versione di Python. Non ha nulla a che fare con la domanda, giusto? O perché pubblichi questo? In che modo questa affermazione è pertinente?
Mayou36

c) conda update -n ENVIRONMENT --all: sono d'accordo che questo è ciò che di solito desidera utilizzare, non per aggiornare l'ambiente di base. Tuttavia, non trovo affatto una spiegazione nella tua risposta su questo, è solo scritto e non fa riferimento alla differenza di usare il comando dell'op nell'ambiente di base.
Mayou36

d) "Se vuoi solo aggiornare quasi tutto, puoi creare un file pin": questa è una buona informazione. Ma non è ciò che OP ha richiesto. Vuole sapere perché non può aggiornare tutto . Non vuole definire le versioni. Quindi non si aggiunge alla risposta, vero?
Mayou36

2

Immagina il grafico delle dipendenze dei pacchetti, quando il numero di pacchetti aumenta, la possibilità di incontrare un conflitto durante l'aggiornamento / l'aggiunta di pacchetti è molto più alta. Per evitare ciò, è sufficiente creare un nuovo ambiente in Anaconda.

Sii frugale, installa solo ciò di cui hai bisogno. Per me, ho installato i seguenti pacchetti nel mio nuovo ambiente:

  • panda
  • scikit-learn
  • matplotlib
  • taccuino
  • keras

E ho 84 pacchetti in totale.


Questo non risponde alla domanda su come aggiornare un pacchetto specifico.
Mayou36,

0

se si lavora in MS Windows, è possibile utilizzare il navigatore Anaconda. fai clic sull'ambiente, nella casella a discesa, è "installato" per impostazione predefinita. È possibile selezionare "aggiornabile" e iniziare da lì


1
Ma come fai a selezionare tutto da aggiornare quando ce ne sono troppi da selezionare singolarmente?
Beldaz,

@beldaz, ho provato a "risolverlo" selezionando tutti i 141 pacchetti nell'ultima colonna con "Versione", quindi premere Applica. Non sono sicuro che funzioni :(. Quindi ho appena aperto la console Anaconda premendo <win> Prompt Anaconda
Pieter21

Esegui come amministratore potrebbe anche essere richiesto
Pieter21

Questo non risolve il problema, né leggere la risposta accettata sui conflitti di dipendenza.
Mayou36,

-1

Per aggiornare tutti i possibili pacchetti che ho usato conda update --update-all

Funziona!


4
No, "non": se rileggi l'OP, si incontrano conflitti di dipendenza. Questa risposta non risolve spiega nulla
Mayou36

-6

Ho risolto questo problema con condaepip .

In primo luogo, corro:

conda uninstall qt and conda uninstall matplotlib and conda uninstall PyQt5

Dopo ciò, ho aperto il cmd ed ho eseguito questo codice

pip uninstall qt , pip uninstall matplotlib , pip uninstall PyQt5

Infine, è necessario installare matplotlibin pip con questo codicepip install matplotlib


6
Questo non è nemmeno vicino a ciò che OP voleva fare
user8408080
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.