在一个程序中读取另一个程序的标准输出
我遇到了一个关于在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()
?直接操作文件描述符一般不太需要。