【发布时间】:2018-07-26 15:17:41
【问题描述】:
我有一个大型项目的一部分,在 python 中包含一个部分,如下所示:
failcount = 0
done = False
while done == False:
try:
result = subprocess.check_output(program)
done = True
except subprocess.CalledProcessError as e:
failcount += 1
logwrite('logfile.txt', 'Failed. Counter = {0}\nError message: {1}\n-'.format(failcount, e.returncode))
if failcount == 20:
print 'It failed 20 times, aborting...'
quit()
这意味着从命令行运行“程序”。 “程序”是一个大型计算化学包,有时会失败,所以我在这里循环运行它。如果它失败了 20 次,那么我的 python 脚本就会终止。这工作得很好,它可以达到预期的效果。但是,我的问题是每次尝试我的化学包大约需要三个小时,我想随时监控它。
如果我从命令行手动运行它,我可以简单地执行“程序 > 日志文件”,然后使用 tail -f 来观察日志文件。但是,您似乎无法在 python 中执行以下操作:
subprocess.check_output(['program', '>', 'logfile'])
有没有办法让 python 在填充时打印出 subprocess.check_output 的内容?我认为 subprocess.check_output 只包含标准输出中的任何内容。我可以以某种方式在 python 和管道之间克隆它吗?
可能的解决方法:我制作了一个名为 run_program.sh 的 bash 脚本,它只执行上面列出的程序 > 日志文件,然后我使用 python 的子进程来执行 run_program.sh。这种方式我可以根据需要进行监控,但现在程序的输出在一个文件中,而不是在 python 中,所以我必须让 python 读取一个大的日志文件,并在需要时捕获错误消息,所以如果可以的话,我会更喜欢避免这样的事情。
【问题讨论】:
标签: python subprocess pipe