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 init
la mayoría de los shells deberán cerrarse y reiniciarse para que los cambios surtan efecto
Sin embargo, claramente ya ha ejecutado conda init
porque 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