【问题标题】:Redirecting stderr when using multiprocessing.Pool使用 multiprocessing.Pool 时重定向标准错误
【发布时间】:2017-09-22 18:08:43
【问题描述】:

我想使用 multiprocessing.Pool (python 2.7.13) 生成多个进程,并将每个进程的 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 会产生带有正确消息的 a.out(“这必须转到 a.out”)。但它会产生空的 a.err,并且错误消息会出现在终端窗口中。

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

def run():
    foo()

【问题讨论】:

    标签: python-2.7 python-multiprocessing


    【解决方案1】:

    使用Pools 时,未处理的异常由主进程处理。您应该将 stderr 重定向到 main(),或者像这样包装您的函数:

    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
    

    【讨论】:

      猜你喜欢
      • 2011-10-11
      • 2012-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多