用子进程调用的程序-记录器消息不打印?

bit*_*man 5 python logging subprocess

如果通过子进程调用该程序,则从程序的记录器获取消息时会出现问题。

这是程序BooFoo.py,它使用记录器将消息打印到文件和控制台窗口:

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')
Run Code Online (Sandbox Code Playgroud)

这是程序CallBooFoo.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
Run Code Online (Sandbox Code Playgroud)

CallBooFoo.py不会打印“ logger boo”。任何想法如何解决这个问题?使用os.system是可行的,但是由于某些其他原因,这不是解决方案。

int*_*jay 3

logging.StreamHandler默认写入标准错误,而不是标准输出。您可以使用logging.StreamHandler(sys.stdout)以下命令将其更改为标准输出。

您还可以保持代码不变,并在调用过程中打印proc_err代替(或补充)的值。proc_out这将显示子进程的标准错误。

如果您需要同时看到 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
Run Code Online (Sandbox Code Playgroud)