如何立即打印标准输出?

时间:2016-10-07 15:10:23

标签: ruby io stdout stdin

如何立即输出stdout?所有输入完成后,stdout将打印出来。

require 'open3'
def run(cmd)
    Open3.popen3(cmd) do |stdin, stdout, stderr, thread|

    Thread.new do
      stdout.each {|l| puts l}
    end

    Thread.new do
      while thread.alive?
        stdin.puts $stdin.gets
      end
    end

    thread.join
  end
end

run ("ruby file_to_test.rb")

file_to_test.rb:

puts "please, enter s"
puts "please, enter q"

s = gets.chomp!
q = gets.chomp!

puts s
puts q

运行main.rb后的结果是:

somestring
somestring2
please, enter s
please, enter q
somestring
somestring2

如何立即输出stdout

2 个答案:

答案 0 :(得分:12)

Ruby正在缓冲输出,直到输出缓冲区已满。要更改行为以便自动编写,请使用syncsync=

old_sync = $stdout.sync
$stdout.sync = true

puts "immediately output lotsa stuff"
puts "immediately output lotsa stuff"
puts "immediately output lotsa stuff"
puts "immediately output lotsa stuff"

# reenable the default behavior
$stdout.sync = old_sync

来自sync=的文档:

  

将“同步模式”设置为true或false。当sync模式为true时,所有输出立即刷新到底层操作系统,并且不在内部缓冲。

重要的是要了解启用缓冲区的自动刷新实际上会降低代码的整体执行速度,尤其是当您要写入想要以块的形式接收数据的文件或设备时。使用sync或小心冲洗。

答案 1 :(得分:3)

刷新输出

您正在寻找的是使用flush方法刷新io流。

每次迭代后尝试以下内容或每次放置:

stdout.flush

如果你连续多次放置,我建议在最后一次之后进行同花,所以你不要经常这样做。例如:

stdout.puts "Hello"
stdout.puts "Mate"
stdout.flush