2014-07-13 49 views
1

假设我有一个计算难题的方法(也许是一个巨大的图中的深度优先搜索),我们可以将这个方法称为dfs(graph)。 此方法也输出到stdout每个结果达到,使用puts resultruby​​-progressbar和stdout

def dfs(graph) 
    while true 
    # lots of computation 

    result = something_reached 
    puts result 
    end 
end 

我想显示在壳进度表明,计算正在运行,所以我想补充一个实例是这样的:

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

和进度状态必须被更新(pbar.increment)的计算是运行。

在shell中,我执行我的计划是这样的:

ruby dfs.rb > dfs_results.txt 

问题

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

    我知道结果可以存储在File.open的使用情况下,但是最好在shell重定向的情况下完成。

问题

我应该如何实施冲洗计算resulta到dfs_results.txt文件,并显示一个进度条,以保持对用户执行的进展?

回答

1

只需打开一个文件登录到:

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

# write into log file 
log.write(result) 

而且你的进度仍然写到标准输出。当您打开第二个屏幕,你可以跟随输出用:

tails -f dfs_results.txt 

更新:或者你可以使用标准输出的进度和标准错误的脚本的输出。

$stderr.puts results 

,并开始与该脚本::不是puts result写的

ruby dfs.rb 2> dfs_results.txt 

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

+0

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

+0

试试这个:https://en.wikipedia.org/wiki/Tee_%28command%29 – JLB