Activando el entorno conda a través de SSH

Activando el entorno conda a través de SSH

Tengo una máquina virtual en Azure donde, después de realizar ssh, puedo ejecutar Conda y Python correctamente:

conda activate py36
python some_script.py

Para ejecutar estos comandos desde mi máquina a través de SSH, necesito proporcionar la ruta completa a Conda:

ssh ${USER}@${IP} "/data/anaconda/envs/py35/bin/conda activate py36; python some_script.py"

pero me sale este error:

CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'.
To initialize your shell, run

    $ conda init <SHELL_NAME>

Currently supported shells are:
  - bash
  - fish
  - tcsh
  - xonsh
  - zsh
  - powershell

See 'conda init --help' for more information and options.

IMPORTANT: You may need to close and restart your shell after running 'conda init'.

Sin embargo, el shell en ejecución es bash:

$ sshb ${USER}@${IP} echo $SHELL
/bin/bash

¿Cómo puedo activar un entorno conda de forma remota a través de SSH?

Respuesta1

Editar: En el proceso de resolver esto descubrí que conda initcrea una función llamada "conda" que enmascara los ejecutables de conda. Ver type conda. Lo que le permite establecer variables de entorno en el shell actual. Esto es importante porque contribuye al problema.

Cuando ejecuta un comando a través de ssh, no ejecuta ~/.bashrc, que es lo que configura esta condafunción bash.

Entonces la respuesta final que tengo para ti es

ssh ${USER}@${IP} ". ~/.bashrc ; conda activate py36; python some_script.py"

. ~/.bashrcsimplemente obtiene el ~/.bashrc que proporciona la función conda si ya lo ha ejecutado conda initantes.

Antigua respuesta

Te sugiero que hagas un script de shell con el código de activación y Python.

# job.sh
conda activate py36
python some_script.py

Hacer ejecutable conchmod +x job.sh

Luego ejecútelo de forma remota con el siguiente comando:

ssh ${USER}@${IP} bash -l "<relative path to script on remote machine>"

bash -llo convierte en un shell de inicio de sesión que también le permite usar su .bash_profileo .bashrclo que significa que no necesitará proporcionar la ruta completa.

Si es absolutamente necesario un solo comando, utilice unheredoc.

ssh ${USER}@${IP} bash -l <<HERE
conda activate py36
python some_script.py
HERE

También probé otras formas, pero parece que hay algún problema con la forma en que bash preserva los cambios ambientales a través de la separación de comandos. La activación de Conda establece varias variables de entorno (con el prefijo CONDA y la variable PATH).

Respuesta2

En lugar de especificar la ruta a "conda", me funciona especificar la ruta a "activar" de esta manera:

ssh [host] "source ~/anaconda3/bin/activate [name of conda env] ; cd [pick a dir] ; [command]"

Para [comando] intente con "conda env list" para ver qué entorno está activado. O puedes hacer "python foo.py".

Es posible que tengas que ajustar la ruta "~/anaconda3/bin/activate".

Respuesta3

Reconstruidos a partir de estoasuntoLogré resolver el problema agregando estas líneas a mi .bashrc:

export -f conda 
export -f __conda_activate 
export -f __conda_reactivate 
export -f __conda_hashr 
export -f __add_sys_prefix_to_path 
eval "$(conda shell.bash hook)"

No estoy seguro de si exporttodavía se necesitan los s con la evalsolución, pero no rompieron nada, así que los conservé.

EDITAR: también es importante tener en cuenta que cualquier script que se utilice condade alguna manera debe ejecutarse bashyno sh.

Respuesta4

Solo una adición a la respuesta de @Maeve Kennedy. En lugar de utilizar comillas dobles, es mejor utilizar comillas simples como se muestra a continuación.

ssh ${USER}@${IP} '. ~/.bashrc ; conda activate py36; python some_script.py'

Le permite ejecutar cualquier comando bash después de activar el entorno conda de forma remota. Algo como a continuación;

ssh ${USER}@${IP} '. ~/.bashrc ; conda activate py36; echo $CONDA_PATH'

con comillas dobles no funciona.

información relacionada