我有一个关于在python中读取stdout的问题。我必须解释一下我想要做的事情。
我有一个Python程序( foo );这会调用第二个python程序( bar )。 bar 将返回stdout状态详细信息以及要记录的其他信息。 foo 现在必须阅读此内容。原则上它有效。我可以获取 bar 的输出并将其发送到日志文件,没有任何问题。当我尝试在 bar (状态报告)的输出中查找某些短语时,问题就开始了。
我正在使用 bar 的标准输出中的 os.read(fn,n)读取输出。问题是 os.read 读取n个字节,但不读取行;它可以或多或少。我希望它读取 bar 写入stdout的每一行,这些行以\ n结尾,并用 print 或 sys.stdout编写。写,然后是 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()
我正在使用
阅读 foobuf = os.read(fd_in[0], 256)
当我将其写入日志文件时:
int_logFile.write(buf)
int_logFile.flush()
一切都很好。但是如果我想像这样抓住输出行的第一个字:
tokens = buf.strip('\n').split(' ')
我最终陷入困境,因为我没有得到TAG,但我可能有INFOx或以前输出的东西与我的状态信息无关。
总而言之,我需要在 foo 中逐行读取 bar 的输出。任何想法???
答案 0 :(得分:2)
呃,bar.stdout.readline()
?一直到文件描述符很少是必要的。
答案 1 :(得分:0)
Popen.communicate怎么样?如果您愿意,也可以将输入发送到流程。