在一个程序中读取另一个程序的标准输出

2 投票
2 回答
1460 浏览
提问于 2025-04-17 04:33

我遇到了一个关于在Python中读取标准输出(stdout)的问题。让我先简单介绍一下我想做的事情。

我有一个Python程序(foo),它会调用另一个Python程序(bar)。bar会把一些状态信息和其他需要记录的信息输出到标准输出。现在,foo需要读取这些信息。原则上,这个过程是可行的。我可以顺利地获取bar的输出并将其发送到日志文件中。但问题出现在我尝试从bar的输出中查找某些特定短语(状态报告)时。

我使用os.read(fn, n)bar的标准输出中读取信息。问题是os.read是按字节读取的,而不是按行读取的;读取的字节数可能多也可能少。我希望它能够逐行读取bar写入标准输出的内容,这些行以\n结尾,并且是通过print或者sys.stdout.write后面跟着sys.stdout.flush()来写的。

foo调用bar的方式是:

bar= subprocess.Popen(args, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
fd_in[0] = bar.stdout.fileno()
fd_in[1] = bar.stderr.fileno()

我目前的代码看起来是这样的。bar输出:

print 'TAG INFO1 INFO2 INFO3'
#or
sys.stdout.write('TAG INFO1 INFO2 INFO3\n')
sys.stdout.flush()

我在foo中读取的方式是

buf = os.read(fd_in[0], 256)

当我用以下方式将其写入日志文件时:

int_logFile.write(buf)
int_logFile.flush()

一切都很好。但是如果我想像这样抓取输出行的第一个单词:

tokens = buf.strip('\n').split(' ')

我就会陷入困境,因为我得到的不是TAG,而可能是INFOx或者其他与我的状态消息无关的内容。

所以总结一下,我需要在foo中逐行读取bar的输出。有没有什么好主意???

2 个回答

0

怎么样呢?这个方法也可以让你在需要的时候给进程发送输入。

2

呃,bar.stdout.readline()?直接操作文件描述符一般不太需要。

撰写回答