
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 init
cria 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 conda
função bash.
Então a resposta final que tenho para você é
ssh ${USER}@${IP} ". ~/.bashrc ; conda activate py36; python some_script.py"
. ~/.bashrc
simplesmente fornece o ~/.bashrc que fornece a função conda se você já executou conda init
antes.
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 -l
torna-o um shell de login que também permite usar o seu .bash_profile
ou, .bashrc
o 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 export
s ainda são necessários com a eval
solução, mas eles não quebraram nada, então apenas os mantive.
EDIT: também é importante ter em mente que qualquer script usado conda
de alguma forma precisa ser executado bash
enã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.