2016-03-07 58 views
1

我正在Python中啓動subprocess並嘗試讀取每行輸出。不幸的是,如果我的流程仍然存在,我無法找到一個好的測試方法。標準方法似乎在檢查poll(),但似乎總是返回None。這是我的代碼。檢查子進程在按行讀取其輸出行時是否仍在運行

proc = Popen(sys.argv[1:], stdin=PIPE, stdout=PIPE, stderr=STDOUT) 

while True: 
    process_line(proc.stdout.readline().decode('utf-8')) 

    if not proc.poll(): 
     break 

for line in proc.communicate()[0].splitlines(): 
    process_line(line.decode('utf-8')) 

我使用os.kill(proc.pid, 0),這適用於非生成的進程也嘗試過,但似乎Python會在進程啓動這樣os.kill(proc.pid, 0)總是返回的句柄。

我在做什麼錯?

+0

您打開了一個管道到進程的stdin。它是否在等待讀取數據? –

+0

否該過程僅輸出數據。將來我想增加對兩個方向的支持,這就是爲什麼我在那裏。 –

回答

1

處理由線路子輸出線,嘗試:

p = subprocess.Popen(cmd, stdout=subprocess.PIPE, bufsize=1) 
while p.poll() is None: 
    line = p.stdout.readline() 
    ...do something with the line here 

通知我將緩衝區大小設置爲1。

也,不需要os.kill(proc.pid, 0)。只需在您生成的子流程中調用 .kill()即可。您也可以致電.wait()等待終止,而不是立即終止進程。

+1

這似乎工作。謝謝。 –

+0

@KrisHarper:如果你想逐行捕獲它的輸出,那麼*不需要*來檢查進程是否還活着。 – jfs

+0

@ J.F.Sebastian嗯所以在你的Python 3的答案在這裏http://stackoverflow.com/a/17698359/817630,當線仍然被髮送到標準輸出時,沒有風險的過程結束?之前我使用這個答案http://stackoverflow.com/a/2716032/817630對同一個問題,但我現在看到它建議你的。 –

相關問題