如何在Ruby中使用Open#popen3读取未缓冲的stdout

时间:2014-04-01 10:46:40

标签: ruby unix io

我正在使用popen3运行进程,并尝试读取stdout流。我希望能够在stdout中检测到每个角色,但即使使用stdout.getc,我只能在有换行符时获得任何输出。

任何提示?我已经看到这回答stdin.getc,但不是stdout。

1 个答案:

答案 0 :(得分:2)

您遇到的问题是,大多数程序在通过管道运行时({1}}会发生这种情况)将使用缓冲输出运行。

但你要找的是无缓冲输出。只有当proccess附加到PTY时才会发生无缓冲输出。即如地狱。

当您将进程附加到管道时,输出将被缓冲,除非进程在其输出处理期间显式调用popen

您有几个选择:

  1. 如果您可以控制使用flush运行的源代码,则在每个输出序列后强制对stdout进行popen调用。

  2. 您可以尝试在flush下运行命令,该命令会尝试强制无缓冲输出。
    看到这个答案:
    Force line-buffering of stdout when piping to tee
    但是,这并不能保证适用于所有程序。

  3. 您可以尝试使用Ruby stdbuf -o0库而不是PTY来使程序在伪终端下运行,因此运行无缓冲。看到这个答案:
    Continuously read from STDOUT of external process in Ruby

  4. 选项3最有可能适用于您要运行和监控的任何程序,而其他选项可能会或可能不会起作用,具体取决于您运行的程序以及您是否可以访问该程序的源代码。 / p>