我正在使用 python 脚本作为流体动力学代码的驱动程序。 When it comes time to run the simulation, I use subprocess.Popen
to run the code, collect the output from stdout
and stderr
into a subprocess.PIPE
--- 然后我可以打印(并保存到日志文件)输出信息,并检查是否有任何错误。问题是,我不知道代码是如何进行的。如果我直接从命令行运行它,它会给我输出关于它在什么时候进行的迭代、什么时间、下一个时间步是什么等等。
有没有一种方法既可以存储输出(用于日志记录和错误检查),又可以生成实时流输出?
我的代码的相关部分:
ret_val = subprocess.Popen( run_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True )
output, errors = ret_val.communicate()
log_file.write(output)
print output
if( ret_val.returncode ):
print "RUN failed\n\n%s\n\n" % (errors)
success = False
if( errors ): log_file.write("\n\n%s\n\n" % errors)
最初我通过管道将 run_command
通过 tee
以便副本直接进入日志文件,并且流仍然直接输出到终端 - 但那样我不能存储任何错误(据我所知)。
到目前为止我的临时解决方案:
ret_val = subprocess.Popen( run_command, stdout=log_file, stderr=subprocess.PIPE, shell=True )
while not ret_val.poll():
log_file.flush()
然后,在另一个终端中,运行 tail -f log.txt
(st log_file = 'log.txt'
)。
原文由 DilithiumMatrix 发布,翻译遵循 CC BY-SA 4.0 许可协议
Python 3 的 TLDR:
您有两种方法可以做到这一点,通过从
read
或readline
函数创建一个迭代器并执行:要么
或者您可以创建一个
reader
和一个writer
文件。将writer
传递给Popen
并从reader
读取这样,您就可以将数据写入
test.log
以及标准输出。文件方法的唯一优点是您的代码不会阻塞。因此,您可以在此期间做任何您想做的事,并随时以非阻塞方式从
reader
读取。当您使用PIPE
、read
和readline
函数将阻塞,直到一个字符写入管道或一行分别写入管道。