2010-06-04 30 views
0

嗨!PyGTK進度條的命令.getstatusoutput

我一直在試圖通過跟蹤rsync的進度來獲取PyGTK進度條。到rsync我正在使用commands.getstatusoutput。

有沒有人有一個想法如何跟蹤rsync的進展,並將其顯示在PyGTK進度條上?

謝謝!

+0

你能張貼的,你已經嘗試過什麼樣的例子嗎? – ptomato 2010-06-08 09:50:38

回答

0

commands.getstatusoutput不會給你你需要爲狀態欄供電的增量輸出。查看從rsync讀取輸出的其他方式。

0

因爲真的沒有辦法以以編程方式跟蹤rsync的進度,我認爲你最好的選擇是「屏蔽」它的輸出並嘗試以某種方式「猜測」它的進度。

您應該做的第一件事是使用subprocess而不是commands.getstatusoutput,因爲您將更好地控制屏幕抓取rsync的stdout來跟蹤其進度。一種解決方案可能是使用-v選項執行rsync,它將打印每個傳輸的文件,然後打印一個換行符(加上一些其他您不需要的文件)。一個簡單的方法在rsync的進展情況來猜測的話,會做這樣的事情:

import subprocess 
p = subprocess.Popen(['rsync', '-v', ..other rsync args..], shell=True, 
     stdout=subprocess.PIPE, close_fds=True) 
while p.stdout.readline(): 
    ... 
    # rsync has just "completed" an operation, i.e. it probably 
    # transferred a file. now would be a good time to update the 
    # ProgressBar. there are some options here, see below... 
    ... 
ret = p.wait() 
print "Rsync exited with code %d" % ret 

這讀取rsync -v ...一條線的同時輸出,並在while循環中,您將更新ProgressBar適當。那麼問題就變成了什麼樣的更新? ProgressBar真的有兩種模式 - 一種是「來回」指示朝着某個不確定的目標前進的過程,另一種是基於向着已知目標的增量從左向右移動酒吧。

您可以嘗試「猜測」rsync將通過事先獲得文件列表來傳輸文件的數量(使用--list-only-vn),並將其用作目標,發件人的文件列表在收集列表和實際執行rsync之間發生變化。更好的解決方案可能只是在while循環中的ProgressBar上調用pulse()來指示事件發生在後臺。如果要顯示更多信息,則可以讀取p.stdout.readline()的輸出並更新gtk.Label某處以指示正在傳輸哪些文件。

(注:上面的代碼執行rsync的時候,你應該做的或許不考慮錯誤條件)

+0

嗨。我已經得到了pulse()的工作,但是我的rsync是ISO,我不想顯示同步進度,但我似乎無法捕獲這個輸出:「118803778 16%400.58kB/s 0 :25:35「,並抓住」16%「可以在進度條上顯示它。如果你有任何想法如何做,這將是有益的!謝謝! – user175259 2010-06-28 02:04:48