Aktivieren der Conda-Umgebung über SSH

Aktivieren der Conda-Umgebung über SSH

Ich habe eine virtuelle Maschine auf Azure, auf der ich nach dem SSH-Verfahren Conda und Python problemlos ausführen kann:

conda activate py36
python some_script.py

Um diese Befehle von meinem Computer über SSH auszuführen, muss ich Conda den vollständigen Pfad angeben:

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

aber ich erhalte diese Fehlermeldung:

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

Dennoch wird die folgende Shell ausgeführt bash:

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

Wie kann ich eine Conda-Umgebung remote über SSH aktivieren?

Antwort1

Bearbeiten: Während ich das ausarbeitete, fand ich heraus, dass conda initeine Funktion namens „conda“ erstellt wird, die die ausführbaren Conda-Dateien maskiert. Siehe type conda. Dadurch kann sie Umgebungsvariablen in der aktuellen Shell festlegen. Das ist wichtig, weil es zum Problem beiträgt.

Wenn Sie einen Befehl über SSH ausführen, wird nicht die Datei ~/.bashrc ausgeführt, die diese condaBash-Funktion einrichtet.

Die endgültige Antwort, die ich für Sie habe, lautet also:

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

. ~/.bashrcruft einfach ~/.bashrc ab, das die Conda-Funktion bereitstellt, wenn Sie sie bereits conda initzuvor ausgeführt haben.

Alte Antwort

Ich würde vorschlagen, dass Sie ein Shell-Skript mit der Aktivierung und dem Python-Code erstellen

# job.sh
conda activate py36
python some_script.py

Lauffähig machen mitchmod +x job.sh

Führen Sie es dann remote mit dem folgenden Befehl aus:

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

bash -lmacht es zu einer Login-Shell, die Ihnen auch die Verwendung von .bash_profileoder ermöglicht .bashrc, sodass Sie nicht den vollständigen Pfad angeben müssen.

Wenn Sie unbedingt einen einzelnen Befehl benötigen, verwenden Siehierdoc.

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

Ich habe es auch auf andere Weise versucht, aber es scheint ein Problem mit der Art und Weise zu geben, wie Bash Umgebungsänderungen über die Befehlstrennung hinweg beibehält. Conda activate setzt verschiedene Umgebungsvariablen (mit dem Präfix CONDA und der Variable PATH).

Antwort2

Anstatt den Pfad zu „conda“ anzugeben, funktioniert es bei mir, den Pfad zu „activate“ wie folgt anzugeben:

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

Versuchen Sie für [Befehl] „conda env list“, um zu sehen, welche Umgebung aktiviert ist. Oder Sie können „python foo.py“ eingeben.

Eventuell müssen Sie den Pfad „~/anaconda3/bin/activate“ anpassen.

Antwort3

Zusammengesetzt aus diesemAusgabeIch konnte das Problem lösen, indem ich folgende Zeilen hinzugefügt habe .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)"

Ich bin nicht sicher, ob die exports bei der Lösung noch benötigt werden eval, aber sie haben nichts kaputt gemacht, also habe ich sie einfach behalten.

EDIT: auch wichtig zu beachten, jedes Skript, das condain irgendeiner Weise verwendet wird, muss mit ausgeführt werden bashundnicht sh.

Antwort4

Nur eine Ergänzung zu @Maeve Kennedys Antwort. Anstatt doppelte Anführungszeichen zu verwenden, verwenden Sie besser einfache Anführungszeichen wie unten

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

Damit können Sie jeden Bash-Befehl ausführen, nachdem Sie die Conda-Umgebung remote aktiviert haben. Etwa wie unten:

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

mit doppelten Anführungszeichen funktioniert es nicht.

verwandte Informationen