如果我理解正確,所有#BSUB
東西都是應輸入到bsub
命令作爲輸入的文本; bsub
在本地運行,然後在計算節點上爲您運行這些命令。
在這種情況下,你不能只是做:
bsub -n 1 < #BSUB -J Proc[1];#BSUB -e ~/logs/proc.%I.%J.err;#BSUB -o ~/logs/proc.%I.%J.out;#BSUB -R "span[hosts=1]";#BSUB -n 1;python main.py
這是由shell解釋爲「運行bsub -n 1
和讀取一個名爲OH廢話評論文件開始,我們現在還沒有文件閱讀!「
您可以使用MOAR HACKERY修復此問題(使用echo
或這裏的字符串對shell執行進一步不必要的依賴)。但是如果你想養活stdin
輸入,最好的解決辦法是使用更強大的工具的任務,the subprocess
module:
# Open a process (no shell wrapper) that we can feed stdin to
proc = subprocess.Popen(['bsub', '-n', '1'], stdin=subprocess.PIPE)
# Feed the command series you needed to stdin, then wait for process to complete
# Per Michael Closson, can't use semi-colons, bsub requires newlines
proc.communicate(b'''#BSUB -J Proc[1]
#BSUB -e ~/logs/proc.%I.%J.err
#BSUB -o ~/logs/proc.%I.%J.out
#BSUB -R "span[hosts=1]"
#BSUB -n 1
python main.py
''')
# Assuming the exit code is meaningful, check it here
if proc.returncode != 0:
# Handle a failed process launch here
這避免了殼推出完全(有需要處理的註釋字符刪除問題所有以及處理shell元字符的所有其他問題),並且明確瞭解本地運行的內容(bsub -n 1
)以及bsub
會話中運行的命令(stdin
)。
你有一個名爲'#BSUB'的命令?這不應該是'BSUB'嗎?否則,你的命令只是一個shell的註釋。 –
是的,他們是這樣評論的,所以他們只能由計算節點處理。就像這樣,在單獨的腳本中的shell代碼工作正常。但在python中使用時不能正常運行。 –
在我工作的計算集羣中,格式非常相似,但我們需要使用外部命令運行腳本,而不是立即運行腳本。也許你應該將文本存儲在一個腳本中,並使用'system('command script_name')來執行' –