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