将subprocess.Popen stdout,stderr发送到日志记录模块

时间:2016-02-18 17:56:02

标签: python python-2.7 logging subprocess

我想使用Pythons subprocess.Popen启动一个应用程序,并将应用程序stdout和stderr的输出发送到日志记录模块,每次应用程序向stdout发送一些/ someline时它都显示为logging.INFO("This is whats in stdout") /标准错误,

由于应用程序是deamon,它确实(并且应该)不会终止。

是否有一种简单的方法可以实现这一目标,还是必须经常使用单独的线程检查过程输出?

3 个答案:

答案 0 :(得分:4)

以下是j-f-sebastian's answer作为可重复使用的课程的内容:

library(foreach)

clusters <- 10
runs <- 101

temp <- foreach(r = 1:runs,
                .combine = 'list',
                .maxcombine = runs,
                .multicombine = T) %do% {

              signal_all <- lapply(1:clusters, function(x){

                return(1)

              })

              return(signal_all)
            } ## end do

答案 1 :(得分:3)

根据我的经验,一个单独的线程是要走的路。这就是我的sarge库如何做到的 - 它使用引擎盖下的线程来捕获子进程的输出。实际上,我通常使用两个线程(一个用于stdout,一个用于stderr),除非我在subprocess.Popen调用中合并两个输出流。

答案 2 :(得分:3)

线程是一种简单易用的消费输出方式(未经测试):

#!/usr/bin/env python
import logging
from subprocess Popen, PIPE, STDOUT
from threading import Thread

def consume_lines(pipe, consume):
    with pipe:
        for line in iter(pipe.readline, b''): #NOTE: workaround read-ahead bug
            consume(line)

logging.basicConfig(level=logging.INFO, format='%(asctime)s %(message)s')
consume = lambda line: logging.info('this is whats in the output: %r', line)

process = Popen(command, stdout=PIPE, stderr=STDOUT, bufsize=1)
Thread(target=consume_lines, args=[process.stdout, consume]).start()
process.wait()