0

你好!

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

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

谢谢!

4

2 回答 2

0

commands.getstatusoutput 不会为您提供为状态栏供电所需的增量输出。查看从 rsync 读取输出的其他方法。

于 2010-06-13T10:34:53.193 回答
0

由于真的没有办法以编程方式跟踪 rsync 的进度,我认为你最好的选择是“屏幕抓取”它的输出并尝试以某种方式“猜测”它的进度。

您应该做的第一件事是使用subprocess而不是,commands.getstatusoutput因为您可以更好地控制屏幕抓取 rsync 的标准输出以跟踪其进度。一种解决方案可能是使用该选项执行 rsync,该-v选项将打印每个传输的文件,后跟一个换行符(加上一些您并不真正需要的其他内容)。那么,猜测 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确实有两种模式 - 一种来回“ping”指示朝着某个不确定目标的进展,另一种根据向已知目标的增量从左到右移动条形图。

--list-only您可以尝试通过事先获取文件列表(使用or )来“猜测” rsync 将传输的文件数量-vn并将其用作目标,但这本质上容易出错,因为您冒着发送者文件列表更改的风险在您收集列表和实际执行 rsync 之间。更好的解决方案可能只是在循环中调用pulse()ProgressBar指示while事情正在后台发生。如果您想显示更多信息,您可以读取输出p.stdout.readline()并更新gtk.Label某处以指示正在传输哪些文件。

(注意:上面的代码在执行 rsync 时没有考虑错误情况,你应该这样做)

于 2010-06-13T17:06:01.623 回答