2011-05-23 10 views
3

このプログラムがサブプロセスで呼び出された場合、プログラムのロガーからメッセージを取得する際に問題があります。サブプロセスロガーメッセージで呼び出されたプログラムは印刷されませんか?

ここでは、ファイルとコンソールウィンドウにメッセージを印刷するロガーを使用するプログラムのBooFoo.pyです:

import subprocess 
proc = subprocess.Popen(['python BooFoo.py'], bufsize=512, stdin = None, 
    stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell=True) 
proc_out, proc_err = proc.communicate() 
print proc_out 

「ロガーブーイング」しません:

import logging 
LOG_FILENAME = 'example.log' 
logging.basicConfig(filename=LOG_FILENAME,level=logging.DEBUG) 
logger = logging.getLogger('main') 
logger.addHandler(logging.StreamHandler()) 
print 'print foo' 
logger.info('logger boo') 

ここCallBooFoo.pyプログラムですCallBooFoo.pyで印刷されます。どのようにこれを修正するための任意のアイデア? os.systemを使用すると動作しますが、その他の理由により解決策ではありません。

答えて

3

logging.StreamHandlerは標準出力ではなく、標準エラーへの書き込みがデフォルトです。代わりにlogging.StreamHandler(sys.stdout)を使用してこれを標準出力に変更することができます。

コードをそのまま使用し、呼び出しプロセスでproc_outの代わりに(またはそれに加えて)proc_errの値を印刷することもできます。子プロセスの標準エラーが表示されます。

あなたがstdoutとstderrの両方を一緒に混合見る必要がある場合は、あなたが呼び出し元のプロセスを変更することができます。

優れ
proc = subprocess.Popen(['python BooFoo.py'], bufsize=512, stdin = None, 
    stdout = subprocess.PIPE, stderr = subprocess.STDOUT, shell=True) 
proc_out, proc_err = proc.communicate() 
print proc_out 
+0

!今私はそれがドキュメントにもあるのを見ています。しかし、私はまだStreamHandlerが通常のメッセージをstderrに向けるのはなぜだろうか? – bitman

+0

@bitmanおそらく、 'logging'は' stderr'の目的である実行に関するissue /メッセージをユーザに報告するために使用されるはずです。 'stdout'は実際のデータ出力用です。 – Evpok

関連する問題