Python 2.7 使用multiprocessing.Pool时重定向stderr
我想使用multiprocessing.Pool(Python2.7.13)生成多个进程,并将每个进程的stdout/stderr重定向到一个文件。问题是它对stdout有效,但对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
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