我一直在試圖通過跟蹤rsync的進度來獲取PyGTK進度條。到rsync我正在使用commands.getstatusoutput。
有沒有人有一個想法如何跟蹤rsync的進展,並將其顯示在PyGTK進度條上?
謝謝!
我一直在試圖通過跟蹤rsync的進度來獲取PyGTK進度條。到rsync我正在使用commands.getstatusoutput。
有沒有人有一個想法如何跟蹤rsync的進展,並將其顯示在PyGTK進度條上?
謝謝!
commands.getstatusoutput不會給你你需要爲狀態欄供電的增量輸出。查看從rsync讀取輸出的其他方式。
因爲真的沒有辦法以以編程方式跟蹤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的時候,你應該做的或許不考慮錯誤條件)
嗨。我已經得到了pulse()的工作,但是我的rsync是ISO,我不想顯示同步進度,但我似乎無法捕獲這個輸出:「118803778 16%400.58kB/s 0 :25:35「,並抓住」16%「可以在進度條上顯示它。如果你有任何想法如何做,這將是有益的!謝謝! – user175259 2010-06-28 02:04:48
你能張貼的,你已經嘗試過什麼樣的例子嗎? – ptomato 2010-06-08 09:50:38