【问题标题】:How to get a dynamic row using subprocess?如何使用子流程获取动态行?
【发布时间】:2012-01-26 14:42:52
【问题描述】:

我正在创建一个 python 脚本,它使用子进程运行 rsync,然后获取标准输出并打印它。

但是有一个问题。当 rsync 开始上传文件时,它会在动态行中显示当前文件、速度等,并且不断变化。 此行从未使用我的脚本打印。我该如何解决?

你可以在这里找到我的完整脚本:https://github.com/danielholm/BareShare/blob/master/bareshare.py

还有一个sn-p:

self.rsyncRun = subprocess.Popen(["rsync","--bwlimit="+upload,"--stats","--progress","-azvv","-e","ssh",local,remotedir,"--log-file="+rsynclog], stdout=subprocess.PIPE)
self.line = self.rsyncRun.stdout.readline()
rsyncM = self.line.rstrip()
self.labelR.set_label(rsyncM)
print "DEBUG: "+rsyncM

【问题讨论】:

    标签: python pygtk subprocess rsync


    【解决方案1】:

    尝试使用-q 运行rsync 或省略-progress 参数,这将抑制动态进度更新。

    【讨论】:

    • 但是我想要当前文件的传输速度。
    【解决方案2】:

    您尝试传递参数 stderr=subprocess.PIPE,如下所示:

    self.rsyncRun = subprocess.Popen(["rsync","--bwlimit="+upload,"--stats","--progress","-azvv","-e","ssh",local,remotedir,"--log-file="+rsynclog], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    

    编辑:然后您必须从 self.rsyncRun.stderr 读取,而不是 self.rsyncRun.stdout。

    EDIT2:更完整的代码示例如下:

    self.rsyncRun = subprocess.Popen(["rsync","--bwlimit="+upload,"--stats","--progress","-azvv","-e","ssh",local,remotedir,"--log-file="+rsynclog], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    outData, errData = self.rsyncRun.communicate()  # this will return the data read from stdout, and stderr
    

    然后你可以检查 outData 和 errData 看看那里是否打印了进度。当然,communicate() 在进程终止之前不会返回,所以如果你想打印一些实时进度,那是行不通的。

    【讨论】:

    • 现在进程不会在退出时死掉。文件“bareshare.py”,第 217 行,在 rsyncOutput self.line = self.rsyncRun.stderr.readline() KeyboardInterrupt
    • 如果标准错误或标准输出缓冲区已满,子进程(rsync)将被阻塞,直到缓冲区被清除。对于大多数渐进式控制台程序,当它们的输出被捕获时。它看起来像:...1%,....2%.....2%.....3%....并不断重复,所以我非常相信情况就是这样。在 Linux 中,PIPE 大小为 4096Bytes,因此很容易被填满。你试过 Popen.communicate() 函数了吗? (阅读docs.python.org/library/subprocess.html 的第 17.1.2 节)
    • 你的意思是我会使用 popen.communicatte() 函数?
    • @DanielHolm,我刚刚添加了一个edit2来解释如何使用communicate()
    • 我又回到了这个问题上。而且我需要连续打印输出。我会用什么来代替 .communicate()?
    猜你喜欢
    • 2023-03-18
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    • 2020-11-27
    • 1970-01-01
    • 2020-09-28
    • 1970-01-01
    相关资源
    最近更新 更多