我想使用Pythons subprocess.Popen启动一个应用程序,并将应用程序stdout和stderr的输出发送到日志记录模块,每次应用程序向stdout发送一些/ someline时它都显示为logging.INFO("This is whats in stdout")
/标准错误,
由于应用程序是deamon,它确实(并且应该)不会终止。
是否有一种简单的方法可以实现这一目标,还是必须经常使用单独的线程检查过程输出?
答案 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()