Как получить динамический ряд с помощью подпроцесса? - PullRequest
2 голосов
/ 26 января 2012

Я создаю скрипт на python, который запускает rsync с использованием подпроцесса, а затем получает стандартный вывод и распечатывает его.

Но есть проблема.Когда 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

Ответы [ 2 ]

0 голосов
/ 26 января 2012

Попробуйте запустить rsync с -q или пропустить аргументы -progress, которые будут подавлять динамическое обновление прогресса.

0 голосов
/ 26 января 2012

Вы попытались передать аргумент 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, чтобы увидеть, печатается ли там прогресс. Конечно, connect () не вернется, пока процесс не завершится, поэтому, если вы хотите распечатать какой-то прогресс, это не сработает.

...