2017-09-22 5 views
1

다중 처리 .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는 ("이 이는 a.out로 이동해야한다") 올바른 메시지와 함께 a.out을 생산하고 있습니다. 그러나 빈 a.err을 생성하고 터미널 창에 오류 메시지가 나타납니다.

다중 처리 .Pool을 사용하지 않고 주 스레드에서 직접 실행하면 두 파일 모두에서 올바른 메시지가 생성됩니다. 이것은 다음 코드로() 실행을 대체하는 의미

def run(): 
    foo() 

답변

0

Pool의를 사용하여, 처리되지 않은 예외는 주요 프로세스에 의해 처리됩니다. 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