
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 init
crea 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 conda
función bash.
Entonces la respuesta final que tengo para ti es
ssh ${USER}@${IP} ". ~/.bashrc ; conda activate py36; python some_script.py"
. ~/.bashrc
simplemente obtiene el ~/.bashrc que proporciona la función conda si ya lo ha ejecutado conda init
antes.
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 -l
lo convierte en un shell de inicio de sesión que también le permite usar su .bash_profile
o .bashrc
lo 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 export
todavía se necesitan los s con la eval
solución, pero no rompieron nada, así que los conservé.
EDITAR: también es importante tener en cuenta que cualquier script que se utilice conda
de alguna manera debe ejecutarse bash
yno 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.