我有一个名为“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}
我该怎么做才能让它发挥作用?也许在测试程序中有一些修改“计数”?
答案 0 :(得分:3)
如果你有一些耐心(价值约50美元),你会发现你确实获得了一行输出,那一行将是"1\n"
。你有两个问题:
count
正在使用缓冲输出。这意味着在stdin
的输出缓冲区已满之前,count
中不会显示任何内容;如果您打印的字节数很少,则在count
完成之前不会刷新缓冲区。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 } }
然后你应该每秒出现一行输出。