【问题标题】:Get partial stdout and stderr from Popen that runs indefinitely [duplicate]从无限期运行的 Popen 获取部分标准输出和标准错误 [重复]
【发布时间】:2009-10-05 21:37:32
【问题描述】:

可能重复:
Bypassing buffering of subprocess output with popen in C or Python

我正在围绕应该无限期运行的服务器 cmd 行脚本构建一个包装器。 我需要做的是在不等待子进程完成的情况下获取当前的 stout。

我的意思是,如果我运行以下命令,一切正常:

ls = Popen(["ls"], stdout=PIPE)
output = ls.stdout.read()

但如果我对无限期运行的程序做同样的事情:

server = Popen(["python","-m","SimpleHTTPServer"], stdout=PIPE)
output = server.stdout.read()

它不会回来...

更新:偶数

 output = server.stdout.read(1) 

挂起...

您知道是否有办法以独立于操作系统的方式从 Popen(或类似的线程实现)捕获部分输出?

【问题讨论】:

  • 查看解决方案here
  • 这是跨平台的吗? (看起来不像)
  • 那里有基本问题的描述和几个解决方案。如果您可以修改正在运行的进程以进行刷新,那是最好的。如果你不能,Alex 概述了 pexpect/wexpect 技巧,它应该涵盖 Unix-y 和 Windows 平台。如果这些不起作用并且您无法更改子进程写入/刷新到 stdout 和 stderr 的方式,那么您很可能不走运。
  • @Santi: 已确认 -- pexpect 所有 Unix 变体公司。 Mac,我们希望在 Windows 上运行(如果您在其他任何平台上运行,则可能有也可能没有其他特殊平台的解决方案)。
  • 好吧,我会检查一下,看看我是否幸运 :) 两个都感谢。

标签: python subprocess


【解决方案1】:

我猜 read() 会返回全部内容?如果您在循环中读取固定大小的块,您可能会得到更好的结果。

【讨论】:

  • 对不起,忘了说这也不行:server.stdout.read(1) 也挂了。
猜你喜欢
  • 2018-12-10
  • 2010-09-21
  • 1970-01-01
  • 2013-01-11
  • 2020-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多