【问题标题】:save output to a file periodically when calling a bash command in python在 python 中调用 bash 命令时定期将输出保存到文件
【发布时间】:2013-07-22 04:52:15
【问题描述】:

我目前正在调用一个外部 c++ 程序,该程序使用 subprocess.check_output 生成大量输出,并将标准输出保存到日志文件中。但是 c++ 程序可能需要很长时间才能完成,但我想在它完成之前查看标准输出,就像我通过 bash 命令行直接执行 c++ 程序一样。

当然,我可以通过使用 fstream 直接修改我的 c++ 程序来保存输出来完成此操作。但是我想知道python中是否有任何可以拦截标准输出的解决方案。

提前谢谢你!

【问题讨论】:

  • 你知道tee命令吗?
  • @hivert 当然我可以在调用c++程序的命令中添加'tee'。但我的问题是关于如何在 Python 中实现这一点。 @Frodon 回答了这个问题。原来我在处理输出时非常习惯使用subprocess.check_output,但完全不知道subprocess.callstdout=logfile

标签: python bash subprocess stdout


【解决方案1】:

如果将输出保存到日志文件中,为什么不使用subprocess.call 并将stdout 设置为打开的日志文件?

with open("logfile") as logfile:
  subprocess.call("run_my_program arg1 arg2", shell=True, stdout=logfile)

然后一个简单的tail -f logfile会告诉你程序执行过程中的日志内容。

【讨论】:

  • 谢谢@Frodon 这行得通!不知道stdoutsubprocess.check_output内部使用,其他人没有。
  • +1 表示stdout=logfile。注意:如果 stdout 不是 tty,C++ 可能会使用块缓冲而不是行缓冲,即输出不会是“实时”的 (follow the links for possible workarounds)。不要不必要地使用shell=True,而是尝试使用列表参数:["my_program", "arg 1", "arg 2"]。以二进制模式(“wb”)打开文件以提高可读性。
  • @J.F.Sebastian 感谢 C++ 的观点。仅供参考,我还发现 Daniel Gallagher 在this answer 中的评论非常清楚地解释了这一点。如果 stdout 是 tty,\n 将刷新输出缓冲区,否则不会,而std::endl 将始终刷新输出缓冲区。 std::endl\n 之间的区别this answer 很好地解释了。
猜你喜欢
  • 1970-01-01
  • 2016-07-13
  • 1970-01-01
  • 2014-08-09
  • 1970-01-01
  • 2018-08-16
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
相关资源
最近更新 更多