如何阅读另一个程序';是Ruby程序中的标准输出吗?
我有一个名为“count”的小型测试Ruby程序,它的计数为1..50如何阅读另一个程序';是Ruby程序中的标准输出吗?,ruby,io,stdout,stdin,popen,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} 我该怎么做才能让它工作?可能对测试程序“count”进行了一些修改?如果您有耐心(大约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}
我该怎么做才能让它工作?可能对测试程序“count”进行了一些修改?如果您有耐心(大约50秒的时间),您会看到您确实得到了一行输出,该行将是“1\n”
。你有两个问题:
计数
正在使用缓冲输出。这意味着在count
的输出缓冲区满之前,stdin
中不会显示任何内容;如果打印的字节数很小,则在count
完成之前不会刷新缓冲区popen
块只查找一行count
中的输出缓冲来解决第一个问题:
STDOUT.sync = true
for i in 1..50 do
STDOUT.puts i
sleep 1
end
然后,在popen
中,您可以使用以下命令迭代行:
然后,您应该每秒显示一行输出。如果我的测试程序是正常程序,该怎么办?例如cURL或WGET,在这种情况下如何设置STDOUT.sync=true?或者我应该编写一个调用普通程序的“包装器”Ruby程序吗?您是否尝试过使用
curl
或wget
?希望在管道中使用的程序往往具有管道意识,并且自己做正确的事情。否则,等待缓冲区填满。
IO.popen("count","r+") { |fp| fp.each { |line| puts line } }