我正在编写一个使用subprocess.Popen的python脚本,以执行两个程序(来自已编译的C代码),每个程序都生成stdout。该脚本获取该输出并将其保存到文件中。因为有时输出的大小足以淹没subprocess.PIPE,导致脚本挂起,所以我将stdout直接发送到日志文件。我想让我的脚本在文件的开头和结尾以及两个subprocess.Popen调用之间写入一些内容。但是,当我查看日志文件时,从脚本写入日志文件的所有内容都放在文件的顶部,然后是所有可执行的stdout。如何将添加的文本插入文件中?
def run(cmd, logfile): p = subprocess.Popen(cmd, shell=True, universal_newlines=True, stdout=logfile) return p def runTest(path, flags, name): log = open(name, "w") print >> log, "Calling executable A" a_ret = run(path + "executable_a_name" + flags, log) print >> log, "Calling executable B" b_ret = run(path + "executable_b_name" + flags, log) print >> log, "More stuff" log.close()
日志文件包含:调用可执行文件A调用可执行文件B更多内容[…两个可执行文件的标准输出…]
例如,是否有一种方法可以在调用Popen之后将A的stdout刷新到日志中?可能还有另一件事:可执行文件A开始,然后挂在B上,在B打印完内容并完成后,A然后打印更多内容并完成。
我在RHE Linux上使用Python 2.4。
您可以在每个Popen对象上调用.wait()以确保它已完成,然后调用log.flush()。也许是这样的:
def run(cmd, logfile): p = subprocess.Popen(cmd, shell=True, universal_newlines=True, stdout=logfile) ret_code = p.wait() logfile.flush() return ret_code
如果需要在外部函数中与Popen对象进行交互,则可以将.wait()调用移到那里。