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

然而,運行的 shell 是bash

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

如何透過SSH遠端啟動conda環境?

答案1

編輯:在解決這個問題的過程中,我發現conda init創建了一個名為「conda」的函數,它對 conda 可執行檔進行了偽裝。看type conda。這允許它在當前 shell 中設定環境變數。這很重要,因為它會導致問題的發生。

當您透過 ssh 執行命令時,它不會執行設定此condabash 函數的 ~/.bashrc。

所以我給你的最終答案是

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

. ~/.bashrc如果您之前已經執行過,只需取得提供 conda 函數的 ~/.bashrc 即可conda init

舊答案

我建議你用激活和Python程式碼製作一個shell腳本

# 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]"

對於 [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'

帶雙引號則不起作用。

相關內容