ruby-progressbar和stdout

时间:2014-07-13 23:37:56

标签: ruby progress-bar stdout

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

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文件并显示进度条以保持用户的执行进度?

1 个答案:

答案 0 :(得分:1)

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

log = File.open('dfs_results.txt', 'w') 

# write into log file
log.write(result)

你的进度条仍然写入stdout。当您打开第二个屏幕时,您可以按照输出:

tails -f dfs_results.txt

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

$stderr.puts results

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

ruby dfs.rb 2> dfs_results.txt

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