SSH経由でconda環境を有効化する

SSH経由でconda環境を有効化する

Azure 上に仮想マシンがあり、SSH で接続すると Conda と Python を問題なく実行できます。

conda activate py36
python some_script.py

SSH 経由で自分のマシンからこれらのコマンドを実行するには、Conda へのフルパスを指定する必要があります。

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

しかし、次のエラーが発生します:

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

ただし、実行中のシェルは次のとおりですbash

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

SSH 経由でリモートで conda 環境をアクティブ化するにはどうすればよいですか?

答え1

編集: この問題を解決する過程で、conda initconda 実行ファイルをマスカレードする「conda」という関数を作成することが分かりました。 を参照してくださいtype conda。これにより、現在のシェルで環境変数を設定できます。これが問題の一因となるため重要です。

ssh 経由でコマンドを実行すると、このcondabash 関数を設定する ~/.bashrc は実行されません。

最終的な答えは

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

. ~/.bashrcすでに実行したことがある場合は、conda 関数を提供する ~/.bashrc を単にソースしますconda init

古い回答

アクティベーションとPythonコードを含むシェルスクリプトを作成することをお勧めします

# job.sh
conda activate py36
python some_script.py

実行可能にするchmod +x job.sh

次に、次のコマンドをリモートで実行します。

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

bash -lログイン シェルになり、 または も使用できるようになる.bash_profileため.bashrc、完全なパスを指定する必要がなくなります。

どうしても単一のコマンドが必要な場合は、ヒアドキュメント

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

他の方法も試してみましたが、bash がコマンドの分離を越えて環境の変更を保存する方法に何らかの問題があるようです。Conda activate は、さまざまな環境変数 (CONDA と PATH 変数のプレフィックスが付く) を設定します。

答え2

「conda」へのパスを指定する代わりに、次のように「activate」へのパスを指定するとうまくいきます。

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

[コマンド] では、どの環境がアクティブになっているかを確認するために「conda env list」を試してください。または、「python foo.py」を実行することもできます。

パス「~/anaconda3/bin/activate」を調整する必要があるかもしれません。

答え3

これをまとめると問題次の行を追加することで問題を解決できました.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)"

exportソリューションに s がまだ必要かどうかはわかりませんevalが、何も壊れていないので、そのままにしておきます。

編集:また、覚えておくべき重要なことは、conda何らかの方法で使用するスクリプトはbashない sh

答え4

@Maeve Kennedy の回答への追加です。二重引用符を使用する代わりに、以下のように一重引用符を使用することをお勧めします。

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

conda 環境をリモートでアクティブ化した後、任意の bash コマンドを実行できます。次のようになります。

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

二重引用符を使用すると機能しません。

関連情報