2014-07-13 78 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