Instale solo los paquetes disponibles usando "conda install --yes --file requirements.txt" sin error

96

Al instalar paquetes en requirements.txt usando Conda a través del siguiente comando

conda install --yes --file requirements.txt

Si un paquete en requirements.txt no está disponible, arroja un "Error de no paquete" como el que se muestra a continuación:

Usando el sitio de API de Anaconda Cloud https://api.anaconda.org

Obteniendo metadatos del paquete: ....

Error: No se encontraron paquetes en los canales actuales de linux-64 que coincidan: nimfa == 1.2.3

Puede buscar este paquete en anaconda.org con

anaconda search -t conda nimfa ==1.2.3

En lugar de lanzar un error, ¿es posible cambiar este comportamiento de manera que instale todos los paquetes disponibles en requirements.txt y arroje una advertencia para los que no están disponibles?

Me gustaría esto porque, el paquete nimfa que el error dice no está disponible, se puede instalar pip. Entonces, si puedo cambiar el comportamiento de conda install --yes --file requirements.txtpara lanzar una advertencia para los paquetes no disponibles, puedo seguir con el comando pip install -r requirments.txten .travis.yml para que TravisCI intente instalarlo desde cualquier lugar donde esté disponible.

cdeepakroy
fuente

Respuestas:

170

Terminé simplemente iterando sobre las líneas del archivo

$ while read requirement; do conda install --yes $requirement; done < requirements.txt

Editar : si desea instalar un paquete usando pip si no está disponible a través de conda, pruebe esto:

$ while read requirement; do conda install --yes $requirement || pip install $requirement; done < requirements.txt

Editar : si está usando Windows (el crédito es para @Clay ):

$ FOR /F "delims=~" %f in (requirements.txt) DO conda install --yes "%f" || pip install "%f"

Hasta Hoffmann
fuente
5
Gracias por esto, pequeña pista para cualquiera que lo use, asegúrese de que su requirements.txt termine con una nueva línea, para que se lea el paquete final
Marawan Okasha
1
¿Hay alguna forma de pip installpaquetes que no están disponibles de forma automática conda installmientras se itera?
PeterB
2
@delusionX, he extendido la respuesta.
Hasta Hoffmann
11
La solución de @TillHoffmann en una máquina con Windows: FOR /F "delims=~" %f in (requirements.txt) DO conda install --yes "%f" || pip install "%f" Funciona muy bien. ¡Gracias!
Clay
3
Si tiene comentarios en el archivo de requisitos, pip se queja prolijamente (molesto aunque inofensivo). Una variación de bash one-liner que ignora los comentarios:while read req; do if [[ $req != "#"* ]]; then conda install --yes $requirement || pip install $requirement; fi; done < requirements.txt
drevicko
1

Para aquellos que buscan, utilicé esto como la solución de @TillHoffmann para la concha de pescado:

$ while read requirement; conda install --yes $requirement; end < requirements.txt

Y

$ while read requirement; conda install --yes $requirement;or pip install $requirement; end < requirements.txt
Yuri-M-Dias
fuente
1

La respuesta de Pbms aquí es la forma correcta de hacerlo, asumiendo que tiene un entorno existente para copiar. Conda es totalmente capaz de instalar tanto los paquetes Conda como los paquetes pip, como se indica en environment.yml. Quería documentar todo el proceso con más detalle. Tenga en cuenta que estoy usando entornos basados ​​en carpetas, por lo que agregué --prefix [path to environment folder]a la mayoría de los comandos.

Supongamos que instaló un entorno para un proyecto existente en una carpeta llamada enven la carpeta actual, como esta:

conda create --prefix ./env

Generarías environment.ymlpara el entorno de ese proyecto de esta manera:

conda env export --prefix ./env > environment.yml

Crearía un nuevo entorno dentro de otra carpeta copiando environment.ymlallí y luego ejecutando esto desde allí:

conda env create --prefix ./env --file environment.yml

Obtendría un entorno ya existente para que coincida environment.ymlcopiando una vez más environment.ymlallí y luego ejecutando esto desde allí:

conda env update --prefix ./env --file environment.yml --prune

Con el entorno en cuestión activo, verificaría el estado de sus paquetes de esta manera:

conda list

Esta es una versión abreviada de lo que podría imprimir ese comando (tenga en cuenta que los paquetes pip están marcados pypi):

# Name                    Version                   Build  Channel
pip                       19.2.2                   py37_0
python                    3.7.4                h5263a28_0
numpy                     1.16.4           py37h19fb1c0_0
pandas                    0.25.1           py37ha925a31_0
pyodbc                    4.0.27           py37ha925a31_0
ibm-db                    3.0.1                    pypi_0    pypi
ibm-db-sa                 0.3.5                    pypi_0    pypi

Finalmente, esta es una versión abreviada de lo que environment.ymlpodría parecer (tenga en cuenta que los paquetes pip se enumeran en su propia categoría):

dependencies:
  - pip=19.2.2=py37_0
  - python=3.7.4=h5263a28_0
  - numpy=1.16.4=py37h19fb1c0_0
  - pandas=0.25.1=py37ha925a31_0
  - pyodbc=4.0.27=py37ha925a31_0
  - pip:
    - ibm-db==3.0.1
    - ibm-db-sa==0.3.5

Tenga en cuenta que usar Conda y pip juntos puede causar algo de acidez estomacal porque, sin saberlo, pueden acabar con las dependencias del otro. Se supone que debes instalar primero todos tus paquetes Conda y luego todos tus paquetes pip, en lugar de alternar entre los dos. Si su entorno se rompe, la recomendación oficial es eliminarlo y volver a crearlo (desde su environment.ymlarchivo). Para obtener más detalles, consulte esta guía:

https://www.anaconda.com/using-pip-in-a-conda-environment/

MarredQueso
fuente