你好!
我一直在尝试通过跟踪 rsync 的进度来使 PyGTK 进度条正常工作。TO rsync 我正在使用 commands.getstatusoutput。
有谁知道如何跟踪 rsync 的进度并将其显示在 PyGTK 进度条上?
谢谢!
你好!
我一直在尝试通过跟踪 rsync 的进度来使 PyGTK 进度条正常工作。TO rsync 我正在使用 commands.getstatusoutput。
有谁知道如何跟踪 rsync 的进度并将其显示在 PyGTK 进度条上?
谢谢!
commands.getstatusoutput 不会为您提供为状态栏供电所需的增量输出。查看从 rsync 读取输出的其他方法。
由于真的没有办法以编程方式跟踪 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 时没有考虑错误情况,你应该这样做)