2017-09-22 89 views
1

我想使用multiprocessing.Pool(python 2.7.13)產生多個進程,並將每個進程的stdout/stderr重定向到一個文件。問題是它適用於stdout,但不適用於stderr。這是一個單一過程的例子。使用多處理時重定向stderr.Pool

import sys 
import multiprocessing as mp 

def foo(): 

    sys.stdout = open('a.out','w') 
    sys.stderr = open('a.err', 'w') 
    print("this must go to a.out.") 
    raise Exception('this must go to a.err.') 

    return True 

def run(): 

    pool = mp.Pool(4) 
    _retvals = [] 
    _retvals.append(pool.apply_async(foo)) 

    retvals = [r.get(timeout=10.) for r in _retvals] 

if __name__ == '__main__': 
    run() 

運行python stderr.py在(的的MacBook)端產生的a.out與正確的消息( 「這必須去A.OUT」)。但它會產生空的a.err,而錯誤信息會出現在終端窗口中。

如果我不使用multiprocessing.Pool並直接在主線程中運行它,它會在兩個文件上生成正確的消息。這意味着與下面的代碼段取代的run():

def run(): 
    foo() 

回答

0

當使用Pool S,未處理的異常由主過程處理。你應該在main()中重定向stderr,或者用這樣的方式包裝你的功能:

def foo(): 
    sys.stdout = open('x.out', 'a') 
    sys.stderr = open('x.err', 'a') 
    try: 
     print("this goes to x.out.") 
     print("this goes to x.err.", file=sys.stderr) 
     raise ValueError('this must go to a.err.') 
    except: 
     traceback.print_exc() 
     raise # optional