2017-09-22 83 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