如何逐行从Ruby程序中读取另一个程序的STDOUT?

时间:2014-06-30 21:28:37

标签: ruby io stdout stdin popen

我有一个名为“count”的小型测试Ruby程序,它的计数为1..50。

#!/usr/bin/ruby
#count
for i in 1..50 do
 STDOUT.puts i
 sleep 1
end

我想从另一个程序调用它,逐行读取输出的数字,并逐行从其他程序输出。

但是我的构造不起作用:

IO.popen("count","r+") {|f| puts f.readline}

我该怎么做才能让它发挥作用?也许在测试程序中有一些修改“计数”?

1 个答案:

答案 0 :(得分:3)

如果你有一些耐心(价值约50美元),你会发现你确实获得了一行输出,那一行将是"1\n"。你有两个问题:

  1. count正在使用缓冲输出。这意味着在stdin的输出缓冲区已满之前,count中不会显示任何内容;如果您打印的字节数很少,则在count完成之前不会刷新缓冲区。
  2. 您的popen区块只查找一行。
  3. 您可以使用STDOUT.sync = true解决第一个问题,以关闭count中的输出缓冲:

    STDOUT.sync = true
    for i in 1..50 do
      STDOUT.puts i
      sleep 1
    end
    

    然后在popen中,您可以使用each迭代这些行:

    IO.popen("count","r+") { |fp| fp.each { |line| puts line } }
    

    然后你应该每秒出现一行输出。