2016-04-29 72 views
1

我有一個腳本,安排一個不同的程序,有時可以並行運行(即我可以多次調用該函數)的長時間運行。我想火,而忘記了這些孩子,所以我現在有:Python子程序讀取標準輸出/標準錯誤,如果程序在<10秒內崩潰

p = subprocess.Popen(cmd, shell=False) 
time.sleep(20) 
result = p.poll() 
if result is not None and result != 0: 
    print("Child failed to start with exit code: {}".format(result)) 
    return False 
return True 

這非常適用於大多數情況,但我想獲得的標準輸出/標準錯誤的孩子,但只有在它失敗的情況下運行超過10秒。

根據我的理解,使用Popen(..., stdout=PIPE)將意味着如果我只是忽略子進程對象,那麼緩衝區將填充並且子進程將掛起。

我該如何解決這個問題,以免它掛起。以某種方式完全可以換出PIPE嗎?

p = subprocess.Popen(cmd, shell=False, stdout=PIPE, stderr=PIPE) 
time.sleep(20) 
result = p.poll() 
if result is not None and result != 0: 
    print("Child failed to start with exit code: {}".format(result)) 
    stdout, stderr = p.communicate() 
    print("STDOUT:", stdout) 
    print("STDERR:", stderr) 
    return False 
return True 

它也是安全的假設,我可以很容易地保持,將在緩存器中的第一個10秒內產生的輸出。

回答

相關問題