【发布时间】:2011-03-12 13:46:55
【问题描述】:
我正在编写一个 python 脚本,它使用 subprocess.Popen 执行两个程序(来自已编译的 C 代码),每个程序都会产生标准输出。该脚本获取该输出并将其保存到文件中。因为输出有时大到足以压倒 subprocess.PIPE,导致脚本挂起,所以我将 stdout 直接发送到日志文件。我想让我的脚本在文件的开头和结尾以及两个 subprocess.Popen 调用之间写一些东西。但是,当我查看我的日志文件时,我从脚本写入日志文件的所有内容都放在文件的顶部,然后是所有可执行的标准输出。如何将添加的文本交错到文件中?
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 的标准输出刷新到日志中?还有一件可能相关的事情:可执行文件 A 开始然后在 B 上挂起,在 B 打印内容并完成之后,A 然后打印更多内容并完成。
我在 RHE Linux 上使用 Python 2.4。
【问题讨论】:
-
当我使用 stdout=subprocess.PIPE 并让外部循环将所有内容写入日志文件时,我能够将自己的文本与可执行文件的输出交错。当我不添加任何文本时,日志的内容按以下顺序排列:1)A 输出 2)B 输出 3)A 输出的其余部分。我可以在每个步骤之前或之后添加文本。现在我只能在日志的开头或结尾添加文本。在 Popen 挂起脚本之后添加一个 wait() ,因为 B 在 A 完成之前不会启动,它不会,因为 A 等待来自 B 的握手。是否可以用这种方法在日志中交错我自己的文本?
标签: python linux subprocess stdout python-2.4