
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 init
eine 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 conda
Bash-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"
. ~/.bashrc
ruft einfach ~/.bashrc ab, das die Conda-Funktion bereitstellt, wenn Sie sie bereits conda init
zuvor 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 -l
macht es zu einer Login-Shell, die Ihnen auch die Verwendung von .bash_profile
oder 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 export
s 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 conda
in irgendeiner Weise verwendet wird, muss mit ausgeführt werden bash
undnicht 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.