HI!
我一直在尝试通过跟踪rsync的进度来使PyGTK Progress Bar工作。要rsync我正在使用commands.getstatusoutput。
有没有人知道如何跟踪rsync的进度并将其显示在PyGTK进度条上?
谢谢!
答案 0 :(得分:0)
commands.getstatusoutput不会为您提供为状态栏供电所需的增量输出。查看从rsync读取输出的其他方法。
答案 1 :(得分:0)
由于无法以编程方式跟踪rsync的进度,我认为最好的选择是“屏蔽”其输出并试图以某种方式“猜测”其进度。
您应该做的第一件事是使用subprocess
而不是commands.getstatusoutput
,因为您可以更好地控制屏幕抓取rsync的标准输出以跟踪其进度。一种解决方案可能是使用-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
实际上有两种模式 - 一种是“来回”,表示朝向一些不确定目标的进展,另一种是根据已知目标的增量将条从左向右移动。
您可以尝试通过事先获取文件列表(使用--list-only
或-vn
)来“猜测”rsync将传输的文件数,并将其用作目标,但这本质上是错误的-prone,因为您在收集列表和实际执行rsync之间存在发件人文件列表更改的风险。更好的解决方案可能只是在pulse()
循环中的ProgressBar
上调用while
,以指示事情正在后台发生。如果要显示更多信息,可以阅读p.stdout.readline()
的输出并在某处更新gtk.Label
以指示正在传输的文件。
(注意:上面的代码没有考虑执行rsync时的错误情况,你应该这样做)