Ativando ambiente conda via SSH

Ativando ambiente conda via SSH

Eu tenho uma máquina virtual no Azure onde, após o ssh, posso executar o Conda e o python, tudo bem:

conda activate py36
python some_script.py

Para executar esses comandos da minha máquina através de SSH, preciso fornecer o caminho completo para o Conda:

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

mas recebo este erro:

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'.

No entanto, o shell em execução é bash:

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

Como posso ativar um ambiente conda remotamente através de SSH?

Responder1

Editar: No processo de resolver isso, descobri que conda initcria uma função chamada "conda" que mascara os executáveis ​​do conda. Ver type conda. O que permite definir variáveis ​​de ambiente no shell atual. Isto é importante porque contribui para o problema.

Quando você executa um comando via ssh, ele não executa o ~/.bashrc que é o que configura esta condafunção bash.

Então a resposta final que tenho para você é

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

. ~/.bashrcsimplesmente fornece o ~/.bashrc que fornece a função conda se você já executou conda initantes.

Resposta Antiga

Eu sugiro que você faça um script de shell com a ativação e o código python

# job.sh
conda activate py36
python some_script.py

Tornar executável comchmod +x job.sh

Em seguida, execute remotamente com o seguinte comando:

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

bash -ltorna-o um shell de login que também permite usar o seu .bash_profileou, .bashrco que significa que você não precisará fornecer o caminho completo.

Se você realmente precisa de um único comando, use umheredoc.

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

Eu tentei outras maneiras também, mas parece que há algum problema com a maneira como o bash preserva as mudanças ambientais na separação de comandos. Conda activate define várias variáveis ​​de ambiente (prefixadas com CONDA e a variável PATH).

Responder2

Em vez de especificar o caminho para "conda", funciona para mim especificar o caminho para "ativar" assim:

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

Para [comando] tente "conda env list" para ver qual ambiente está ativado. Ou você pode fazer "python foo.py".

Talvez seja necessário ajustar o caminho "~/anaconda3/bin/activate".

Responder3

Reunidos a partir dissoemitirConsegui resolver o problema adicionando estas linhas ao meu .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)"

Não tenho certeza se os exports ainda são necessários com a evalsolução, mas eles não quebraram nada, então apenas os mantive.

EDIT: também é importante ter em mente que qualquer script usado condade alguma forma precisa ser executado bashenão sh.

Responder4

Apenas um acréscimo à resposta de @Maeve Kennedy. Em vez de usar aspas duplas, é melhor usar aspas simples como abaixo

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

Ele permite que você execute qualquer comando bash após ativar o ambiente conda remotamente. Algo como abaixo;

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

com aspas duplas não funciona.

informação relacionada