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

时间:2012-11-27 06:05:44

标签: python progress-bar rsync

我使用rsync的开发版本和--info-progress选项。我正在编写一个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变量,但它不会返回任何内容。

1 个答案:

答案 0 :(得分:1)

很抱歉,但这可能既不能用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可以使用它。