【问题标题】:How can I have console output display to stdout AND store it in a variable?如何将控制台输出显示到标准输出并将其存储在变量中?
【发布时间】:2011-11-08 17:13:26
【问题描述】:

如果我这样做:

output = %x{some_script}

...然后我将打印到标准输出的内容存储在output;但我没有看到它出现在屏幕上。

另一方面,如果我这样做:

success = system "some_script"

...然后我看到输出出现在屏幕上,但我没有将它存储在变量中(success 只是保存一个布尔值)。

有什么方法可以同时获得吗?我知道我可以这样做:

output = %x{some_script}
puts output

但问题在于some_script 可能是一个运行时间相当长的脚本,在这种情况下,我看到什么都没有,直到整个事情完成。我更希望看到生成的输出,以及在完成后将其全部存储在 output 变量中。

【问题讨论】:

    标签: ruby console rake stdout


    【解决方案1】:

    这是IO.popen的解决方案:

    require 'stringio'
    
    output = StringIO.new
    
    IO.popen("ls") do |pipe|
      pipe.each do |line|
        output.puts line
        puts line
      end
    end
    
    puts output.string # => Outputs the contents of `output` as a string
    

    【讨论】:

    • 如果还需要标准错误流,也可以使用popen3
    • 我错过了什么吗?这似乎也要等到命令完成执行,就像%x{} + puts 选项一样。
    • @Dan:听起来你有缓冲问题。
    • 我的错误:我使用了一个过于简单的脚本来测试它;从@mu 获得提示并在我的真实脚本上实际尝试后,我发现它有效。谢谢!
    【解决方案2】:

    你可以猴子补丁Kernel::puts,但我只能想到一种笨拙的全局方式来存储结果:

    class Kernel
      alias_method :old_puts, :puts
      def puts(*args)
        old_puts args
        $output << args
      end
    end
    

    【讨论】:

      猜你喜欢
      • 2012-09-09
      • 2015-07-21
      • 1970-01-01
      • 1970-01-01
      • 2014-05-06
      • 1970-01-01
      • 1970-01-01
      • 2022-07-29
      相关资源
      最近更新 更多