2012-01-26 2 views
2

Я создаю скрипт 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 

ответ

0

Вы пробовали проходящее аргумент 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) 

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

+0

Теперь процесс обыкновение умирать на выходе .. Файл "bareshare.py", строки 217, в rsyncOutput self.line = self.rsyncRun.stderr.readline() KeyboardInterrupt –

+0

Если STDERR, или стандартный вывод буфера заполняется, подпроцесс (rsync) будет заблокирован до тех пор, пока буфер не будет очищен. Для большинства прогрессивных консольных программ, когда их вывод захватывается. Это будет выглядеть следующим образом: ... 1%, .... 2% ..... 2% ..... 3% .... и продолжайте повторять, поэтому я очень верю, что это так. В Linux размер PIPE составляет 4096 бит, поэтому это может легко заполниться. Вы еще пытались использовать функцию Popen.communicate()? (Прочитайте раздел 17.1.2 http://docs.python.org/library/subprocess.html) – xkrz

+0

Как вы хотите использовать функцию popen.communicatte()? –

0

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

+0

Но я хочу скорость передачи текущего файла. –

Смежные вопросы