Python 2.7 使用multiprocessing.Pool时重定向stderr

Python 2.7 使用multiprocessing.Pool时重定向stderr,python-2.7,python-multiprocessing,Python 2.7,Python Multiprocessing,我想使用multiprocessing.Pool(Python2.7.13)生成多个进程,并将每个进程的stdout/stderr重定向到一个文件。问题是它对stdout有效,但对stderr无效。下面是一个单一流程的示例 import sys import multiprocessing as mp def foo(): sys.stdout = open('a.out','w') sys.stderr = open('a.err', 'w') print("th

我想使用multiprocessing.Pool(Python2.7.13)生成多个进程,并将每个进程的stdout/stderr重定向到一个文件。问题是它对stdout有效,但对stderr无效。下面是一个单一流程的示例

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()
在(macbook的)终端中运行
python stderr.py
会生成一个带有正确消息的.out(“这必须转到a.out”)。但它会生成空的a.err,错误消息将显示在终端窗口中

如果我不使用multiprocessing.Pool并直接在主线程中运行它,它将在两个文件上生成正确的消息。这意味着将run()替换为以下代码段:

def run():
    foo()

使用
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