it-swarm-ja.com

SSH経由でconda環境をアクティブ化する

Azureに仮想マシンがあり、sshを実行した後、Condaを実行してpython alright:

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
miguelmorin

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

Sshを介してコマンドを実行すると、このconda bash関数を設定する〜/ .bashrcは実行されません。

だから私があなたのために持っている最終的な答えは

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

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

古い答え

アクティベーションと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を使用できるようにします。これは、完全なパスを指定する必要がないことを意味します。

絶対に1つのコマンドが必要な場合は、 heredoc を使用します。

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

他の方法も試しましたが、bashがコマンドの分離全体で環境の変化を保存する方法に問題があるようです。 Conda activateは、さまざまな環境変数を設定します(CONDAとPATH変数が前に付いています)。

3
Maeve Kennedy

これからつなぎ合わせて issue これらの行を.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)"

exportsがevalソリューションでまだ必要かどうかはわかりませんが、何も壊さなかったので、そのままにしておきました。

編集:覚えておくことが重要です。何らかの方法でcondaを使用するスクリプトは、bashおよびnotで実行する必要があります。 -)sh

1
Tox