2017-09-22 10 views
1

マルチプロセッシング.Pool(python 2.7.13)を使用して複数のプロセスを生成し、各プロセスのstdout/stderrをファイルにリダイレクトしたい。問題はstdoutでは動作しますが、stderrでは動作しません。ここでは、1つのプロセスの例を示します。 (のMacBookの)マルチプロセッシングを使用するときのstderrのリダイレクト

ターミナルで python stderr.pyを実行
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() 

は正しいメッセージ( "これはa.outのために行かなければならない")とのa.out生成します。しかし、空のa.errが生成され、代わりに端末ウィンドウにエラーメッセージが表示されます。

私がmultiprocessing.Poolを使用せず、メインスレッドで直接実行すると、両方のファイルに正しいメッセージが生成されます。これは、次のコードで()の実行を交換する手段:

def run(): 
    foo() 

答えて

0

Pool Sを使用して、未処理の例外は、メインプロセスによって処理されます。 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 
関連する問題