2016-04-26 67 views
1

使用子進程模塊(Python 2.7),我正在運行一個命令並嘗試在運行時處理其輸出。Python - 從長時間運行的子進程讀取輸出

我有類似下面的代碼:

process = subprocess.Popen(
    ['udevadm', 'monitor', '--subsystem=usb', '--property'], 
    stdout=subprocess.PIPE) 
for line in iter(process.stdout.readline, ''): 
    print(line) 

然而,只輸出被打印後,我按Ctrl + C,即使我在打印語句後添加sys.stdout.flush()

爲什麼會發生這種情況,我該如何直播這個過程的輸出?

值得注意的是,這個udevadm monitor命令不打算終止,所以我不能簡單地等待進程終止並一次處理其輸出。

我發現live output from subprocess command但接受的答案中的方法並沒有解決我的問題。

+0

參見[段落是開頭的聯繫:「如果子標準輸出採用的是塊緩衝」(http://stackoverflow.com/a/17698359/ 4279) – jfs

回答

1

你可以使用unbuffer

process = subprocess.Popen(
    ["unbuffer", 'udevadm', 'monitor', '--subsystem=usb', '--property'], 
    stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
for line in iter(process.stdout.readline, ''): 
    print(line) 
+0

謝謝!這工作。但有沒有辦法只用Python來做到這一點?我寧願避免「expect」依賴。 –

+0

不幸的是,我不能看到一種方式,但肯定並不意味着沒有,我確實看到一些輸出,如果我斷開並重新連接到使用端口的東西,但大塊比行緩衝,仍然在輸出之間的體面延遲 –

相關問題