¿Cómo clonar el entorno de trabajo de Python en otra máquina?

26

Desarrollé un modelo de aprendizaje automático con Python (Anaconda + Flask) en mi estación de trabajo y todo sale bien. Más tarde, intenté enviar este programa a otra máquina donde, por supuesto, intenté configurar el mismo entorno, pero el programa no se ejecuta. Copié el programa a otras máquinas donde también funciona sin problemas.

No puedo entender cuál es el problema en el caso fallido (tanto el código del programa como el mensaje de error son abundantes, así que no puedo presentarlos aquí) pero estoy casi seguro de que es algo con las diferentes versiones de las dependencias .

Entonces, mi pregunta es que, dado un entorno en el que un cierto programa se ejecuta bien, ¿cómo puedo clonarlo en otro donde también debería funcionar bien? Por supuesto, sin la clonación del sistema completo;)

Hendrik
fuente
Utilice conda env export.
kbrose

Respuestas:

39

En primer lugar, esta es una pregunta de Python / Anaconda y probablemente debería formularse en un subsitio de intercambio de pila diferente.


En cuanto a la pregunta en sí, puede exportar su entorno Anaconda usando:

conda env export > environment.yml

Y recrearlo usando:

conda env create -f environment.yml

Tenga en cuenta que, como otros sugirieron, debe usar entornos virtuales que le permitan crear un entorno determinado que esté separado del de su máquina y administrarlo más fácilmente.

Para crear un entorno virtual en Anaconda puede usar:

conda create -n yourenvname python=x.x anaconda

que activa usando:

source activate yourenvname
ginge
fuente
La documentación de Anaconda no es muy clara sobre si usarla conda createo conda env createcuando comparte / recrea un entorno. ¿Podría por favor detallar más por qué recomienda usar conda env createen esta situación?
Tanguy
Puede encontrar algunas notas sobre la diferencia entre conda createy conda env createaquí: groups.google.com/a/continuum.io/forum/#!topic/conda/… Dicho esto, creo que normalmente podría usarlos indistintamente.
Ginge
1
He visto este hilo, pero precisamente estoy tratando de entender con precisión en qué situación se debe preferir cada opción ( conda createvs conda env create) y cuáles son las desventajas de cada uno (por ejemplo: "[ conda env createes para] entornos en los que se han instalado paquetes que utilizan pip , lo que causa complejidad adicional ": ¿qué tipo de complejidad adicional agrega?).
Tanguy
Quiero preguntar que cuando se ejecute conda env create -f environment.yml, esto causará un error porque el nombre de virtenv en el archivo yml ya se ha utilizado. Cambia el nombre a tu nueva virtud para vencer.
Giang Nguyễn
¡De esta manera te salva la vida! si crea un entorno a partir de un archivo basado en las instrucciones de la página de entornos de gestión de Anaconda, no funciona si utiliza otra plataforma. conda list --explicit > FILE_NAMEexporta binarios para la plataforma actual y aparentemente no funciona en otra.
Shayan Amani
5

Busque en 'contenedores', por ejemplo, Docker ( https://www.docker.com/what-container ), una alternativa más liviana a la virtualización.

Requerirá una inversión de tiempo, pero al final proporcionará muchos beneficios.

Desde el enlace, donde marqué su necesidad específica en negrita y cursiva :

Empaquete el software en unidades estandarizadas para desarrollo, envío e implementación

Una imagen de contenedor es un paquete ligero, independiente y ejecutable de un software que incluye todo lo necesario para ejecutarlo: código, tiempo de ejecución, herramientas del sistema, bibliotecas del sistema, configuraciones. Disponible para aplicaciones basadas en Linux y Windows, el software en contenedores siempre se ejecutará igual, independientemente del entorno . Los contenedores aíslan el software de su entorno, por ejemplo, las diferencias entre los entornos de desarrollo y preparación y ayudan a reducir los conflictos entre los equipos que ejecutan software diferente en la misma infraestructura.

Pieter21
fuente
5

Primero exporte la configuración del entorno de su entorno conda actual utilizando:

conda-env  export -n your_env_name > your_env_name.yml

ejemplo:

conda-env  export -n base> base.yml

Después de ejecutar el comando anterior, debe haber un archivo de configuración yml en su directorio actual que contenga información de su entorno conda

Para crear un nuevo entorno utilizando el archivo de configuración yml, ejecute:

conda-env create -n new_env -f=\path\to\base.yml 

ejemplo:

conda-env create -n venv -f=base.yml

En caso de que el anterior no funcione (debido a los diversos problemas de conda), siempre vale la pena intentarlo con la siguiente variación:

conda-env create --name new_env --file \path\to\base.yml 
Muhammad Umar Amanat
fuente
4

Si su programa es principalmente Python, puede confiar únicamente en entornos virtuales.

Cree entornos virtuales para aislar sus dependencias en lugar de usar las bibliotecas del sistema. Luego use herramientas de entorno virtual para duplicar sus entornos.

En el virtualenv de trabajo, cree un archivo con la versión de cada biblioteca Python instalada:

pip freeze > requirements.txt

En el nuevo virtualenv, solicite pipinstalar esas bibliotecas con la misma versión:

pip install -r requirements.txt

Esto asegura que obtenga las mismas versiones de lib en ambas máquinas. Y dado que su VCS rastrea los requisitos.txt, siempre puede recrear el entorno de una versión anterior de su código.

Por supuesto, si necesita una base de datos, un servidor web de producción, etc., terminará con algunos pasos más y no podrá confiar en virtualenv para garantizar que ambos entornos coincidan. Aquí es donde interviene Docker (ver la respuesta de Pieter21 ).

Jérôme
fuente
No noté la anacondaetiqueta en tu pregunta. No tengo experiencia con esto, pero ten cuidado. Creo que anaconda tiene su propia forma de gestionar entornos y usar ambos anaconda y virtualenvpodría meterte en problemas. Sin embargo, supongo que anaconda debería ofrecer características equivalentes.
Jérôme
1

Desde el final de esta página de documentación :

Guardar paquetes para uso futuro:

conda list --export > package-list.txt

Reinstale paquetes desde un archivo de exportación:

conda create -n myenv --file package-list.txt
Miladiosos
fuente
1

Un resumen de las formas existentes para crear un entorno basado en otro:

  • Clonando un ambiente :

    • Desde un entorno existente:

      $ conda create --name ORIG_ENV_NAME --clone CLONE_ENV_NAME

    • Desde un archivo de entorno exportado en la misma máquina:

      $ conda create --name ENV_NAME —-file FILE_NAME.yml

    • Desde un archivo de entorno exportado en una máquina diferente:
      $ conda env export > ENV_NAME.yml
      $ conda env create -f ENV_NAME.yml```
Shayan Amani
fuente
$ conda create --name NEW_ENV_NAME --clone ORIG_ENV_NAME
B. dom
0

Un trazador de líneas

conda create --clone source_env --name destination_env

salhin
fuente