2016-02-03 101 views
2

我試圖從python文件運行shell代碼來提交另一個python文件到計算集羣。 shell代碼如下:使用os.system多行命令

#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 

但是,當我從蟒蛇運行它像下面我不能得到它的工作:

from os import system 
system('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') 

是有什麼我做錯了什麼?

+1

你有一個名爲'#BSUB'的命令?這不應該是'BSUB'嗎?否則,你的命令只是一個shell的註釋。 –

+0

是的,他們是這樣評論的,所以他們只能由計算節點處理。就像這樣,在單獨的腳本中的shell代碼工作正常。但在python中使用時不能正常運行。 –

+2

在我工作的計算集羣中,格式非常相似,但我們需要使用外部命令運行腳本,而不是立即運行腳本。也許你應該將文本存儲在一個腳本中,並使用'system('command script_name')來執行' –

回答

2

如果我理解正確,所有#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)。

1

#BSUB指令由bsub二進制文件解析,它不支持;作爲分隔符。你需要使用換行符。這對我有效。

#!/usr/bin/python 
import subprocess; 

# 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 
input="""#!/bin/sh 
#BSUB -J mysleep 
sleep 101 
""" 
proc.communicate(input); 

***所以顯然我從@ ShadowRanger得到了Python代碼。 +1他的回答。如果SO在評論中支持python代碼,我會將其作爲註釋發佈給他的回答。

+0

我將換行符合併到了我的答案中(我從來沒有使用'bsub',所以我認爲分號是合法的)。小記:爲了確保它可以同時適用於Py2和Py3,輸入應該以'b'作爲前綴,以便在Py3上明確指定'bytes'(在Py2上,'b'什麼都不做,只是記錄了使用二進制數據的意圖,這有助於稍後轉換爲2to3,但它也不會受到影響,因此代碼可以在Py2和Py3上運行而無需修改)。 – ShadowRanger

相關問題