如何使用子流程获取动态行?

2024-09-19 23:34:49 发布

您现在位置:Python中文网/ 问答频道 /正文

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

但是有一个问题。当文件开始动态上传时,rsync会不断地显示当前文件的速度。 这一行从不使用我的脚本打印。我该怎么解决?在

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

还有一个片段:

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

Tags: 文件httpsselfgithub脚本com进程stdout
2条回答

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

你试着传递论点stderr=子流程.管道如下所示:

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.标准输出. 在

编辑2:更完整的代码示例如下:

^{pr2}$

然后您可以检查outData和errData,看看进度是否打印在那里。当然,communicate()在进程终止之前不会返回,因此如果您希望打印出一些实时进度,那么这是行不通的。在

相关问题 更多 >