Saltar al contenido

Python: active conda env a través de un script de shell

Luego de tanto luchar pudimos dar con la solución de este apuro que algunos usuarios de este espacio han tenido. Si tienes algún detalle que compartir no dejes de compartir tu conocimiento.

Solución:

Uso el ‘comando fuente’ para ejecutar el script de shell, funciona:

source shell_script.sh

El mensaje de error es bastante útil: le dice que conda no está configurado correctamente desde el subshell en el que se ejecuta su secuencia de comandos. Para poder usar conda dentro de una secuencia de comandos, deberá (como dice el mensaje de error) ejecutar conda init bash (o cualquiera que sea su caparazón) primero. El comportamiento de conda y cómo está configurado depende de su versión de conda, pero el motivo del comportamiento de la versión 4.4+ es que conda depende de ciertas variables de entorno que normalmente configura el propio shell de conda. Lo que es más importante, esta entrada del registro de cambios explica por qué su conda activate y deactivate los comandos ya no se comportan como esperas en las versiones 4.4 y superiores.

Para obtener más información sobre esto, consulte el número oficial de conda en GitHub.


Editar: Algunas investigaciones más me dicen que el conda init La función mencionada en el mensaje de error es en realidad una nueva función v4.6.0 que permite una configuración rápida del entorno para que pueda usar conda activate en lugar del viejo source activate. Sin embargo, la razón por la que esto funciona es que agrega/cambia varias variables de entorno de su shell actual y también realiza cambios en su archivo RC (por ejemplo: .bashrc), y los cambios del archivo RC nunca se recogen en el shell actual, solo en los shells recién creados. (A menos que, por supuesto, obtenga .bashrc nuevamente). De hecho, conda init --help dice tanto:

IMPORTANTE: Después de correr conda initla mayoría de los shells deberán cerrarse y reiniciarse para que los cambios surtan efecto

Sin embargo, claramente ya ha ejecutado conda initporque tú son capaz de usar conda activate interactivamente. De hecho, si abre su .bashrc, debería poder ver algunas líneas agregadas por conda que le enseñan a su shell dónde buscar los comandos de conda. Sin embargo, el problema con su secuencia de comandos radica en el hecho de que el .bashrc es no obtenido por el subshell que ejecuta scripts de shell (consulte esta respuesta para obtener más información). Esto significa que aunque su shell interactivo sin inicio de sesión vea los comandos conda, sus subshells de script no interactivos no lo harán, sin importar cuántas veces llame conda init.

Esto lleva a una conjetura (yo no tengo conda en Linux, así que no puedo probarlo) que al ejecutar su secuencia de comandos de esta manera:

bash -i shell_script.sh

debería ver conda activate funcione correctamente. ¿Por qué? -i es un indicador de bash que le dice al shell que está comenzando a ejecutarse en modo interactivo, lo que significa que generará automáticamente su .bashrc. Esto debería ser suficiente para permitirle usar conda dentro de su script como si lo estuviera usando normalmente.

Solución rápida para bash: anteponer la siguiente secuencia de comandos de inicio en sus secuencias de comandos Bash.

eval "$(command conda 'shell.bash' 'hook' 2> /dev/null)"

Hecho.


Para otros shells, verifique la conf de inicio de su shell, copie el siguiente contenido dentro de la conf de shell y anótelo en sus scripts.

# >>> conda initialize >>>
...
# <<< conda initialize <<<

También puedes usar

conda init --all --dry-run --verbose

para obtener el script de inicio que necesita en sus scripts.

Explicación

Esto está relacionado con la introducción de conda init en conda 4.6.

Cita del registro de lanzamiento de conda 4.6

Conda 4.4 permitió "conda activar envname". El problema era que configurar su shell para usar esta nueva función no siempre era sencillo. Conda 4.6 agrega un amplio soporte de inicialización para que más shells que nunca puedan usar el nuevo comando "conda activar". Para obtener más información, lea el resultado de “conda init –help”

Después conda init se introduce en conda 4.6, conda solo expone el comando
conda en el PATH pero no todos los binarios de "base". Y el cambio de entorno está unificado por conda activate env-name y conda deactivate en todas las plataformas.

Pero para que estos nuevos comandos funcionen, debe realizar una inicialización adicional con conda init.

El problema es que su archivo de script se ejecuta en un sub-shell, y conda no se inicializa en esta subcapa.

Referencias

  • Versión Conda 4.6
  • Inicialización del shell de Unix
  • Scripts de inicio de shell

Sección de Reseñas y Valoraciones

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *