anaconda actualiza todos los paquetes posibles?

151

conda search --outdatedProbé el , hay muchos paquetes obsoletos, por ejemplo, scipy es 0.17.1 pero el último es 0.18.0. Sin embargo, cuando hago el conda update --all. No actualizará ningún paquete.

actualización 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:
#

actualización 2

Puedo actualizar esos paquetes por separado. Que puedo hacer conda update scipy. ¿Pero por qué no puedo actualizarlos todos de una vez?

Wang
fuente
2
Puede ser porque el último scipy tiene una dependencia conflictiva. Por ejemplo, puede requerir NumPy 1.11, pero tiene un paquete diferente que requiere NumPy 1.10. Puede intentar conda update --all --alt-hintver si da algún resultado ... O simplemente intentar conda update scipyver qué sucede (quizás con la --alt-hintbandera)
darthbith
@darthbith, consulte la actualización 1. No hay información útil.
Wang
1
But why I cannot update all of them in one go?Probablemente porque tiene al menos un paquete que depende de una versión anterior y, por lo tanto, no se puede actualizar nada.
cel
¿Es posible averiguar cuál depende de los paquetes antiguos?
Wang
3
Recomiendo correr conda update condaantesconda update --all
gizzmole

Respuestas:

230

TL; DR: conflictos de dependencia: la actualización de uno requiere (según sus requisitos) degradar a otro

Tienes razón:

conda update --all

es en realidad el camino a seguir 1 . Conda siempre intenta actualizar los paquetes a la versión más reciente de la serie (por ejemplo, Python 2.xo 3.x).

Conflictos de dependencia

Pero es posible que haya conflictos de dependencia (que impiden una actualización adicional). Conda generalmente advierte muy explícitamente si ocurren.

Por ejemplo, X requiere Y <5.0, por lo que Y nunca será> = 5.0

Es por eso que 'no' puedes actualizarlos a todos.

Resolviendo

Para agregar: tal vez podría funcionar, pero una versión más nueva de X que funciona con Y> 5.0 no está disponible en conda. Es posible instalar con pip, ya que hay más paquetes disponibles en pip. Pero tenga en cuenta que pip también instala paquetes si existen conflictos de dependencia y que generalmente rompe su entorno conda en el sentido de que ya no puede instalar de manera confiable con conda. Si lo hace, hágalo como último recurso y después de que todos los paquetes se hayan instalado con conda. Es más bien un truco.

Una forma segura de probar es agregar conda-forge como un canal al actualizar (agregar -c conda-forgecomo marca ) o cualquier otro canal que encuentre que contenga su paquete si realmente necesita esta nueva versión . De esta manera, conda también busca en estos lugares los paquetes disponibles.

Teniendo en cuenta su actualización : puede actualizarlos por separado, pero hacerlo no solo incluirá una actualización sino también una degradación de otro paquete. Digamos, para agregar al ejemplo anterior:

X> 2.0 requiere Y <5.0, X <2.0 requiere Y> 5.0

Por lo tanto, actualizar Y> 5.0 implica degradar X a <2.0 y viceversa.

( Este es un ejemplo pedagógico, por supuesto, pero en realidad es el mismo, generalmente solo con dependencias y subdependencias más complicadas )

Por lo tanto, aún no puede actualizarlos a todos haciendo las actualizaciones por separado; las dependencias simplemente no son satisfactorias, por lo que antes o después, una actualización degradará un paquete ya actualizado nuevamente. O rompa la compatibilidad de los paquetes (¡lo que generalmente no desea!), Que solo es posible invocando explícitamente un comando de ignorar dependencias y forzar . Pero eso es solo para hackear los problemas, ¡definitivamente no es el caso del usuario normal!


1 Si realmente desea actualizar los paquetes de su instalación, que generalmente no desea . El comando ejecutado en el entorno base actualizará los paquetes en esto, pero por lo general debe trabajar con entornos virtuales ( conda create -n myenvy luego conda activate myenv). La ejecución conda update --alldentro de dicho entorno actualizará los paquetes dentro de este entorno. Sin embargo, dado que el entorno base también es un entorno, la respuesta se aplica a ambos casos de la misma manera.

Mayou36
fuente
1
Si está utilizando conda, ¡no rompa su entorno cuando sobrescribe con pip! Si está utilizando un entorno de ciencia de datos, NO instale paquetes aislados porque es más probable que con pip rompa su entorno.
InLaw
1
Estoy de acuerdo, usar pip hace que conda ya no funcione de manera confiable. He agregado esto a la respuesta explícitamente.
Mayou36
15

Para responder más precisamente a la pregunta:

conda (que es conda para miniconda como para Anaconda) actualiza todo excepto SOLO dentro de una versión específica de un paquete -> mayor y menor. Ese es el paradigma.

En la documentación encontrará "NOTA: Conda se actualiza a la versión más alta de su serie, por lo que Python 2.7 se actualiza a la más alta disponible en la serie 2.xy 3.6 actualizaciones a la más alta disponible en la serie 3.x". Doc

Si Wang no da un ejemplo reproducible, uno solo puede ayudar. por ejemplo, ¿es realmente el entorno virtual que quiere actualizar o Wang podría obtener lo que quiere?

conda update -n ENVIRONMENT --all

* ¡POR FAVOR lea los documentos antes de ejecutar "actualizar --todos"! Esto no conduce a una actualización de todos los paquetes por naturaleza. Debido a que conda intenta resolver la relación de dependencias entre todos los paquetes en su entorno, esto puede conducir a paquetes DOWNGRADED sin advertencias.


Si solo desea actualizar casi todos, puede crear un archivo pin

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

antes de ejecutar la actualización.

Si más adelante desea ignorar el archivo en su env para una actualización, puede hacer lo siguiente:

conda update --all --no-pin

No debes actualizar --todos. Sin embargo, si lo necesita, puede ahorrar para probar esto en un entorno clonado.

El primer paso siempre debe ser hacer una copia de seguridad de su especificación actual:

conda list -n py35 --explicit 

(pero aun así no siempre hay un enlace a la fuente disponible, como para las extensiones jupyterlab)

A continuación, puede clonar y actualizar:

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


actualizar:

Debido a que la idea de conda es agradable pero no está funcionando muy bien en entornos complejos, personalmente prefiero la combinación de nix-shell (or lorri) and poetry[como pip / conda superior]) ( introducción poetry2nix ).


Finalmente, si realmente necesita trabajar con paquetes que no son compatibles debido a sus dependencias, es posible con tecnologías como NixOS / nix-pkgs .

Consuegro
fuente
3
Esta respuesta asume: 1. instaló miniconda3 con el nombre y la ruta predeterminados (y no, por ejemplo, anaconda) 2. que creó un entorno "py35". Puede especificar que los principiantes, a quienes debe dirigirse esta respuesta (en mi opinión), pueden confundirse fácilmente. Además, parece que realmente no responde la pregunta, ya que esto aún no le permite actualizar. Y ese es su objetivo.
Mayou36
Por supuesto, permítanme preguntarles individualmente: a) "SOLO dentro de una versión específica": esto se refiere a la versión de Python, no a los paquetes, ¿verdad? ¿O puedes citar esto por favor?
Mayou36
b) "En la documentación encontrará [...]": esto se refiere claramente a la versión de Python. No tiene nada que ver con la pregunta, ¿correcto? ¿O por qué publicas esto? ¿Cómo es relevante esta declaración?
Mayou36
c) conda update -n ENVIRONMENT --all: Estoy de acuerdo en que esto es lo que él / ella generalmente quiere usar, no para actualizar el entorno base. Sin embargo, no encuentro una explicación en su respuesta sobre esto en absoluto, solo está escrito y no se refiere a la diferencia de usar el comando de la operación en el entorno base.
Mayou36
d) "Si solo desea actualizar casi todo, puede crear un archivo pin": esta es una buena información. Pero no es lo que OP pidió. Quiere saber por qué no puede actualizar todo . No quiere precisar versiones. Entonces no agrega a la respuesta, ¿verdad?
Mayou36
2

Imagine el gráfico de dependencia de los paquetes, cuando el número de paquetes aumenta, la posibilidad de encontrar un conflicto al actualizar / agregar paquetes es mucho mayor. Para evitar esto, simplemente cree un nuevo entorno en Anaconda.

Sea frugal, instale solo lo que necesita. Para mí, instalé los siguientes paquetes en mi nuevo entorno:

  • pandas
  • scikit-learn
  • matplotlib
  • cuaderno
  • keras

Y tengo 84 paquetes en total.

Espectral
fuente
Esto no responde la pregunta sobre cómo actualizar un paquete específico.
Mayou36
0

si trabaja en MS windows, puede usar el navegador Anaconda. haga clic en el entorno, en el cuadro desplegable, está "instalado" de forma predeterminada. Puede seleccionar "actualizable" y comenzar desde allí

David
fuente
1
Pero, ¿cómo selecciona todo para actualizar cuando hay demasiados para seleccionar individualmente?
beldaz
@beldaz, intenté 'resolverlo' seleccionando los 141 paquetes en la última columna con 'Versión', y luego presioné Aplicar. No estoy seguro si funciona :(. Entonces acabo de abrir la consola de Anaconda presionando <win> Anaconda Prompt
Pieter21
Ejecutar como administrador también puede ser necesario
Pieter21
Esto tampoco resolverá el problema real, lea la respuesta aceptada sobre conflictos de dependencia.
Mayou36
-1

Para actualizar todos los paquetes posibles que utilicé conda update --update-all

¡Funciona!

nein nein
fuente
44
No, "no": si relees el OP, se encuentran conflictos de dependencia. Esta respuesta no resuelve ni explica nada
Mayou36
-6

Resolví este problema con conday pip.

En primer lugar, corro:

conda uninstall qt and conda uninstall matplotlib and conda uninstall PyQt5

Después de eso, abrí el cmd y ejecuté este código que

pip uninstall qt , pip uninstall matplotlib , pip uninstall PyQt5

Por último, debe instalar matplotliben pip por este código quepip install matplotlib

Mantakeke
fuente
66
Esto ni siquiera está cerca de lo que OP quería hacer
usuario8408080