我有一个名为“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}
我该怎么做才能让它发挥作用?也许测试程序中的一些修改“计数”?
如果你有一些耐心(价值约50s),你会看到你确实获得了一行输出,那一行将是"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 } }
然后你应该每秒出现一行输出。