【问题标题】:Program called with subprocess - logger messages are not printed?用子进程调用的程序 - 不打印记录器消息?
【发布时间】:2011-05-23 14:08:07
【问题描述】:

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

这是使用记录器将消息打印到文件和控制台窗口的程序 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')

这是 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

"logger boo" 不会与 CallBooFoo.py 一起打印。知道如何解决这个问题吗?使用 os.system 是可行的,但由于其他一些原因,这不是一个解决方案。

【问题讨论】:

    标签: python logging subprocess


    【解决方案1】:

    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
    

    【讨论】:

    • 太棒了!现在我看到它也在文档中。但我还是想知道为什么 StreamHandler 会将普通消息直接发送到 stderr?
    • @bitman 可能是因为logging 应该用于向用户报告有关执行的问题/消息,这是stderr 的目的。 stdout 用于实际数据输出。
    猜你喜欢
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    • 2021-09-16
    • 1970-01-01
    • 1970-01-01
    • 2021-05-10
    • 2020-02-23
    • 2011-02-15
    相关资源
    最近更新 更多