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

问题描述 投票:1回答:1

我有一个名为“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}

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

ruby io stdout stdin popen
1个回答
3
投票

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

  1. count正在使用缓冲输出。这意味着在stdin的输出缓冲区已满之前,你的count中不会出现任何内容;给定您正在打印的少量字节,在count完成之前不会刷新缓冲区。
  2. 你的popen区块只寻找一条线。

您可以使用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 } }

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

© www.soinside.com 2019 - 2024. All rights reserved.