【问题标题】:How to print stdout immediately?如何立即打印标准输出?
【发布时间】:2017-02-16 15:30:45
【问题描述】:

如何立即输出stdoutstdout 将在所有输入完成后打印。

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

【问题讨论】:

  • 也许您正在寻找flush
  • @pjs 是的,我看到了这个,但它不想工作,或者我使用它不正确......
  • 您在每个printputs 之后放置了$stdout.flushSTDOUT.flush

标签: ruby io stdout stdin


【解决方案1】:

刷新输出

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

在每次迭代或每次放置后尝试以下操作:

stdout.flush

如果您连续有多个 put,我建议在最后一个之后执行 flush,因此您不要经常这样做。示例:

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

【讨论】:

  • 哦,伙计,你不会相信,但我忘了在运行 ruby​​-code 之前按 Ctrl-S,我认为这个解决方案不起作用。现在我再试一次,它正在工作)
【解决方案2】:

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 或小心冲洗。

【讨论】:

    猜你喜欢
    • 2020-11-02
    • 2013-05-01
    • 1970-01-01
    • 2016-03-04
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    • 2018-12-25
    • 2018-08-10
    相关资源
    最近更新 更多