【问题标题】:ruby-progressbar and stdout红宝石进度条和标准输出
【发布时间】:2014-07-13 23:37:55
【问题描述】:

假设我有一个计算难题的方法(可能是在一个巨大的图中进行深度优先搜索),我们可以将此方法称为dfs(graph)。 此方法还使用puts result 将达到的每个结果输出到stdout

def dfs(graph)
  while true
    # lots of computation

    result = something_reached
    puts result
  end
end

我想在 shell 中显示一个进度条来表明计算正在运行,所以我添加了一个这样的实例:

pbar = ProgressBar.create(title: "Computing", starting_at: 1, total: nil)

并且必须在计算运行时更新进度条状态 (pbar.increment)。

在 shell 中,我这样执行我的程序:

ruby dfs.rb > dfs_results.txt

问题

  • pbar 被刷新到 stdout,所以 prograss-bar 被重定向到 dfs_results.txt 并且计算结果不存储在这个文件中。 没有pbar,结果数据按预期存储在文件中,但显然没有进度条。

    我知道可以使用File.open 存储结果,但最好使用 shell 重定向

问题

我应该如何实现将计算结果刷新到dfs_results.txt 文件并显示进度条以保持用户的执行进度?

【问题讨论】:

    标签: ruby progress-bar stdout


    【解决方案1】:

    只需打开一个文件即可登录:

    log = File.open('dfs_results.txt', 'w') 
    
    # write into log file
    log.write(result)
    

    而且您的进度条仍会写入标准输出。当您打开第二个屏幕时,您可以跟随输出:

    tails -f dfs_results.txt
    

    更新: 或者您可以使用 stdout 作为进度条,使用 stderr 作为脚本输出。而不是puts result 写:

    $stderr.puts results
    

    并使用以下命令启动脚本:

    ruby dfs.rb 2> dfs_results.txt
    

    我仍然认为第一个版本更好,因为结果不是错误...

    【讨论】:

    • 谢谢,您的建议是一个很好的替代解决方案。我已经指定了一个限制。我希望它可以通过 shell 重定向来完成,而不是从我的程序中打开文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-09
    相关资源
    最近更新 更多