如何在Python中显示和解析rsync进度?

6

我正在使用带有--info-progress选项的rsync开发版本。我正在编写一个Python程序,使用rsync将文件从服务器传输到本地计算机:

finalresult = subprocess.Popen(['sshpass', '-p', password, 'rsync', '-avz', '--info=progress2', 'hostname:/filename', '/home/nfs/django/user'],
                                    stdout=subprocess.PIPE).communicate()[0]

当我在终端中运行程序时,它没有显示进度,但是如果我单独使用rsync实用程序,则会显示进度。我想在终端中看到进度,并解析或获取进度百分比,以便稍后实时向用户显示进度条。谢谢!
编辑: 这是我目前尝试过的: 上面的代码将命令处理存储在finalresult变量中。我试图在django模板中打印finalresult变量,但它并没有返回任何内容。

如果您能找到一种方法将回调与(非缓冲的)stdout相关联,那么只需根据字符的输入做出反应即可。或者,间接地,像监视文件系统并对那里的更改做出反应 - 例如文件增长,时间变化?这只是一些想法。 - John Mee
我正在尝试使用stdout来实现结果。如果有人能指点我正确的方向,那就太好了。 - Joyfulgrind
基于你一贯的“求助吸血鬼”行为,我不太愿意替你完成。我可以指引你前往这个方向,鼓励你改变自己,成为一个愿意通过学习提升自己的人:http://docs.python.org/2/library/subprocess.html#subprocess.check_output。当你解决问题后,请回来并发布答案。 - John Mee
我想在终端中显示进度条。如何解析进度并在真实应用程序中展示? - Joyfulgrind
让我们在聊天中继续这个讨论。 (链接:http://chat.stackoverflow.com/rooms/20219/discussion-between-sachitad-and-john-mee) - Joyfulgrind
1个回答

2
抱歉,使用 subprocess 或标准库中的其他方式可能无法完成该操作。这是因为在 subprocess.communicate() 中会发现以下内容:
def wait(self):
   """Wait for child process to terminate.  Returns returncode
   attribute."""
   if self.returncode is None:
      # Try calling a function os.waitpid(self.pid, 0)
      # Ignore Interrupted System Call (errno.EINTR) errors  
      pid, sts = _eintr_retry_call(os.waitpid, self.pid, 0)
      self._handle_exitstatus(sts)
   return self.returncode

在Unix中,os.waitpid()函数调用的意思是:等待由进程ID pid指定的子进程完成,并返回一个包含其进程ID和退出状态指示的元组。因此,您必须等待子进程完成。
最接近的替代方法将是pexpect,但它仍然无法进行进度条分析。一种可能的解决方案是黑客攻击rsync并修补其进度输出,以便pexpect可以使用它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接