我尝试在Ruby中运行外部命令,并解析其输出。
IO.popen(command, :err=>[:child, :out]) {|ls_io|
ls_io.each do |line|
print line
end
}
这样做的方式可以创造奇迹......除非我解析c程序的进度输出,用\ r显示进度到标准输出。
只要c程序没有输出\ n(只要它没有完成一些长操作),Ruby就会等待并且什么也看不到。然后当输出\ n时,Ruby会看到它全部
1%\r2%\r3%\r…100%
task finished
我尝试了所有调用外部命令的方法(例如Calling shell commands from Ruby);但似乎都没有抓住进展。我也尝试了STDOUT.sync = true
这样的每个操作员,而c程序确实调用了fflush(stdout)
我终于找到了一个workaroud。我这样做:
IO.popen(commande, :err=>[:child, :out]) {|ls_io|
while true
byte=ls_io.read(1)
if byte.nil?
break
end
print byte
end
}
这很愚蠢......但它确实有效。
更优雅的方式,以及更有效的方式来做到这一点?性能非常糟糕,好像刷新率"很慢。
答案 0 :(得分:0)
将输入记录分隔符设置为" \ r"在您阻止之前(如果您事先知道):
$/ = "\r"
全局预设变量的参考:http://www.zenspider.com/Languages/Ruby/QuickRef.html#pre-defined-variables