
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 init
conda 実行ファイルをマスカレードする「conda」という関数を作成することが分かりました。 を参照してくださいtype conda
。これにより、現在のシェルで環境変数を設定できます。これが問題の一因となるため重要です。
ssh 経由でコマンドを実行すると、このconda
bash 関数を設定する ~/.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'
二重引用符を使用すると機能しません。