ruby progressbar和标准输出

ruby progressbar和标准输出,ruby,progress-bar,stdout,Ruby,Progress Bar,Stdout,假设我有一个计算难题的方法(可能是在一个巨大的图中进行深度优先搜索),我们可以将此方法称为dfs(graph)。 此方法还使用put result将每个结果输出到stdout def dfs(图形) 虽然是真的 #大量计算 结果=达到某个目标 结果 结束 结束 我想在shell中显示一个progressbar,以显示计算正在运行,因此我添加了一个如下实例: pbar=ProgressBar.create(标题:“计算”,起始时间:1,总计:零) 在计算运行时,必须更新progressbar状

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

def dfs(图形)
虽然是真的
#大量计算
结果=达到某个目标
结果
结束
结束
我想在shell中显示一个progressbar,以显示计算正在运行,因此我添加了一个如下实例:

pbar=ProgressBar.create(标题:“计算”,起始时间:1,总计:零)
在计算运行时,必须更新progressbar状态(
pbar.increment

在shell中,我执行的程序如下:

ruby dfs.rb>dfs\u results.txt
问题

  • 随着
    pbar
    被刷新到
    stdout
    ,因此程序栏被重定向到
    dfs\u results.txt
    ,计算结果不存储在此文件中。 如果没有
    pbar
    ,结果数据按预期存储在文件中,但显然没有进度条

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

问题


我应该如何实现将计算结果刷新到
dfs\u results.txt
文件,并显示一个进度条来为用户保留执行进度?

只需打开一个文件登录:

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

# write into log file
log.write(result)
你的progressbar仍然会写入标准输出。当您打开第二个屏幕时,您可以使用以下命令跟踪输出:

tails -f dfs_results.txt
更新:或者您可以对progressbar使用stdout,对脚本的输出使用stderr。而不是
放入结果
写入:

$stderr.puts results
并以以下内容开始脚本:

ruby dfs.rb 2> dfs_results.txt

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

谢谢,你的建议是一个很好的替代方案。我已经指定了一个限制。我希望它可以通过shell重定向来完成,而不是从我的程序中打开文件。