PyGTK进度条的commands.getstatusoutput

时间:2010-06-04 16:07:55

标签: progress-bar pygtk progress

HI!

我一直在尝试通过跟踪rsync的进度来使PyGTK Progress Bar工作。要rsync我正在使用commands.getstatusoutput。

有没有人知道如何跟踪rsync的进度并将其显示在PyGTK进度条上?

谢谢!

2 个答案:

答案 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时的错误情况,你应该这样做)