2012-10-17 35 views
2

我有一個使用os.system運行shell命令的Python腳本。這些命令的輸出回顯到屏幕上;我喜歡這個,需要保持它。我還希望我的腳本能夠根據系統調用的輸出內容採取行動。我怎樣才能做到這一點?將os.system的輸出打印到屏幕上並根據它執行操作

在我的具體情況下,我打電話給os.system("svn update")。我需要輸出到屏幕上(例如,如果發生衝突),用戶需要能夠與svn進行交互。我希望能夠讓腳本根據輸出採取行動 - 例如,如果它看到構建腳本已更新,則觸發構建。

我不希望自己處理I/O(這看起來不必要地複雜),我寧願不將輸出發送到臨時文件,我必須稍後清理(儘管如果必須)。

編輯:

這裏是我的測試腳本:

#!/usr/bin/python -t 

import subprocess 

output = subprocess.check_output(["echo","one"]) 
print "python:", output 

output = subprocess.check_output(["echo", "two"], shell=True) 
print "python:", output 

output = subprocess.check_output("echo three", shell=True) 
print "python:", output 

,這裏是它的輸出:

$ ./pytest 
python: one 

python: 

python: three 

(有在該代碼塊沒有結束一個額外的空白行)我期待的更像是:

$ ./pytest 
one 
python: one 
two 
python: 
three 
python: three 
+3

你不能用'os.system'。你需要使用'subprocess' ...然後這些事情會變得棘手。在'svn update'運行之後等待採取行動是否正確,或者實際上是否需要在運行時與進程交互? – mgilson

+0

@mgilson用戶需要與流程進行交互(以決定如何解決衝突)。腳本不需要與進程交互 - 它只需要grep輸出特定的字符串或正則表達式。 – CajunLuke

+0

這是否需要成爲一個跨平臺的解決方案,還是隻能使用純Linux解決方案? –

回答

2

要運行一個進程,我會查看subprocess.check_output。在這種情況下,類似於:

output = subprocess.check_output(['svn','update']) 
print output 

這隻適用於python2.7或更新版本。如果你想要一個適用於老版本python的版本:

p = subprocess.Popen(['svn','update'],stdout=subprocess.PIPE) 
output,stderr = p.communicate() 
print output 
+0

我在python 2.7上,所以我嘗試了子進程版本(subprocess.check_output([「echo」,「one」])和subprocess.check_output([「echo」,「two」],shell = True)'),但是既不向shell打印任何東西。此外,前者返回「一」(如預期),但後者不返回「兩」)。 – CajunLuke

+0

我認爲'shell = True',運行的程序應該是一個單獨的字符串,就像在交互式運行時將shell作爲輸入一樣。嘗試'subprocess.check_output(「echo two」,shell = True)'?你可以用'print'在shell中顯示輸出嗎? –

+0

@SamMussmann我會用我的測試腳本及其輸出來編輯問題。的確,它看起來似乎shell = True不會讓你使用命令arg列表。 – CajunLuke