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

How to show and parse rsync progress in Python?

提问人:Joyfulgrind 提问时间:11/27/2012 最后编辑:Joyfulgrind 更新时间:11/28/2012 访问量:2274

问:

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

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

当我在终端中运行程序时,它不会向我显示进度,但是如果我独立使用 rsync 实用程序,它会显示进度。我想在终端中查看进度,并解析或获取进度百分比,以便稍后使用它来实时向用户显示进度条。谢谢!

编辑:这是我到目前为止尝试过的: 上面的代码将命令处理存储在变量中。我试图在 django 模板中打印变量,但它没有返回任何内容。finalresultfinalresult

python 进度条 rsync

评论

0赞 John Mee 11/27/2012
如果你能找到一种方法将回调与(无缓冲的)stdout 相关联,那么你只需在字符进入时做出反应即可开展业务。或者,是间接的,比如监控文件系统并对那里的变化做出反应 - 例如文件增长,时代变化?只是想法。
0赞 Joyfulgrind 11/28/2012
我正在尝试使用 stdout 实现结果。如果有人为我指出正确的方向,那就太好了。
0赞 John Mee 11/28/2012
根据你作为连环帮助吸血鬼的既定历史,我不愿意为你做这件事。请允许我鼓励你改过自新,成为一个愿意通过向你指出这个方向来改善自己的人。当你想通了,回来发布答案。
0赞 Joyfulgrind 11/28/2012
我想在终端中显示进度条。如何解析进度并在真实应用程序中显示?
0赞 Joyfulgrind 11/28/2012
让我们在聊天中继续讨论

答:

2赞 Zaur Nasibov 11/28/2012 #1

对不起,这可能既不能用标准库的其余部分完成,也不能用标准库的其余部分来完成。那是因为在里面你会发现:subprocesssubprocess.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 可以使用它。