Saltar al contenido

Python: activa conda env a través del script de shell

Solución:

Utilizo ‘comando de origen’ para ejecutar el script de shell, funciona:

source shell_script.sh

El mensaje de error es bastante útil: le indica que conda no está configurado correctamente desde el subshell en el que se está ejecutando su script. Para poder usar conda dentro de un script, deberá (como dice el mensaje de error) ejecutar conda init bash (o cualquiera que sea tu 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 conda. Lo más importante es que esta entrada del registro de cambios explica por qué conda activate y deactivate Los comandos ya no se comportan como esperaba 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: Un poco más de investigación me dice 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, vuelva a obtener .bashrc). De hecho, conda init --help dice tanto:

IMPORTANTE: después de correr conda init, la mayoría de los shells deberán cerrarse y reiniciarse para que los cambios surtan efecto

Sin embargo, claramente ya has corrido conda init, porque tú están capaz de usar conda activate interactivamente. De hecho, si abre su .bashrc, debería poder ver algunas líneas agregadas por conda enseñándole a su shell dónde buscar los comandos de conda. El problema con su script, sin embargo, radica en el hecho de que el .bashrc es no procedente de la subshell que ejecuta scripts de shell (consulte esta respuesta para obtener más información). Esto significa que aunque su shell interactivo que no es de inicio de sesión ve los comandos conda, sus subcapas de script no interactivo no lo harán, sin importar cuántas veces llame conda init.

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

bash -i shell_script.sh

deberías ver conda activate funciona correctamente. ¿Por qué? -i es una bandera de bash que le dice al shell que está comenzando a ejecutar en modo interactivo, lo que significa que automáticamente generará 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 el siguiente script de inicio en sus scripts Bash.

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

Hecho.


Para otros shells, verifique el init conf de su shell, copie el siguiente contenido dentro del shell conf y antepóngalo 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 versiones de conda 4.6

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

Después conda init se introduce en conda 4.6, comando conda solo exponer
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 este sub-shell.

Referencias

  • Lanzamiento de Conda 4.6
  • Inicialización del shell de Unix
  • Secuencias de comandos de inicio de Shell
¡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 *