【问题标题】:Real-time output of a rake task with popen3使用 popen3 实时输出 rake 任务
【发布时间】:2019-07-13 23:52:21
【问题描述】:

在获得实时输出的同时,从popen3 块中运行 rake 任务似乎是不可能的。所有行在 rake 任务结束时立即出现。我正在尝试通过popen3 块从 rake 任务中获取实时输出

cmd = 'rake perform_a_task'
Open3::popen3(cmd) do |std_in, std_out, std_err|
  std_out.each_line do |line|
    puts line
  end
end

如何重现

概念证明:rake 任务

  1. 如下创建任务
task :print_and_wait do
  puts 'A'
  sleep 1
  puts 'B'
  sleep 1
  putc 'C'
end
  1. 从命令行调用任务

$ rake print_and_wait 输出 3 行(A、B 和 C),中间有 1 秒的停顿。不出所料

概念证明 2:popen3

  1. 创建一个 shell 脚本
$ cat print_and_wait
#!/bin/bash
echo 'A'
sleep 1
echo 'B'
sleep 1
echo 'C'
  1. 创建一个红宝石脚本
$ cat print_and_wait.rb
require 'open3'

def exec_async(cmd)
  Open3::popen3(cmd) do |std_in, std_out, std_err|
    std_out.each_line do |line|
      puts line
    end
  end
end

exec_async './print_and_wait'
  1. 运行 ruby​​ 脚本

$ ruby print_and_wait.rb 按预期工作:输出 3 行,中间停顿一秒

哪里不行

  • 编辑 ruby​​ 脚本 print_and_wait.rb 并将 exec_async './print_and_wait' 更改为 exec_async 'rake print_and_wait'
  • 运行$ ruby print_and_wait.rb
  • 没有输出,3 秒后所有 3 行同时打印

我尝试了几种组合,但始终无法按预期工作。知道为什么这不起作用吗?这是一个错误吗?

谢谢

【问题讨论】:

    标签: ruby rake rake-task popen3


    【解决方案1】:

    在 rake 任务的开头添加$stdout.sync = true 解决了它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-02
      相关资源
      最近更新 更多