2012-12-19 25 views
2

我有在Python中運行的Linux命令。如何接收Python中發生的命令輸出?

roc = subprocess.Popen(['sshpass', '-p', password, 'rsync', '-avz', '--info=progress2', hostname, '/home/zurelsoft/test'], 
            stderr=subprocess.PIPE, stdout=subprocess.PIPE).communicate()[0] 
print roc 

只有當它完成執行時纔會打印命令處理。但是,我希望在命令發生時輸出,並在命令完全執行時停止。如何做到這一點?

回答

3

你可以檢查出SelectSelect Example

Python’s select()功能是直接接口,底層操作系統的實現。它監視套接字,打開文件和管道(任何帶有返回有效文件描述符的fileno()方法),直到它們變得可讀或可寫,或發生通信錯誤。

select()可以更容易地同時監視多個連接,並且比使用套接字超時在Python中編寫輪詢循環更有效,因爲監視發生在操作系統網絡層而不是解釋器。

如果這沒有幫助,你也可以看看

Persistent python subprocess

How can I read all availably data from subprocess.Popen.stdout (non blocking)?

+0

謝謝您的回答。我想將命令的輸出存儲在變量中,並將它作爲json發送給javascript。但我想在終端本身stdin.write()輸出。它可以存儲在一個變量,並可以在JavaScript中傳遞?由於 – user1881957

+0

@ user1881957:你可以轉儲在一個文件中,並完成後讀它,但如果你想使用這個變量以及按我的理解,你不能因爲你不能輸出追加到一個變量,你只能重新分配它,你不想要的(它會分配新的輸出並覆蓋之前存儲的輸出) – avasal

+0

我試圖用這些數據顯示進度條,因此完成後沒有指向它。我需要一種方式來讀取正在發生的進度。 – user1881957

0

這應該由命令行工作,如果你通過subprocess.Popen呼之爲你做什麼,而是管傳遞到sys.stdout通過更改:

stdout=sys.stdout 

將管道傳遞給打開的可寫文件對象可保存輸出。

out = open("output.tmp","w") 
subprocess.Popen(["ls","-R"],stdout = out) 
out = open("output.tmp","r") 
output = out.readlines()