Я создаю скрипт 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
Теперь процесс обыкновение умирать на выходе .. Файл "bareshare.py", строки 217, в rsyncOutput self.line = self.rsyncRun.stderr.readline() KeyboardInterrupt –
Если STDERR, или стандартный вывод буфера заполняется, подпроцесс (rsync) будет заблокирован до тех пор, пока буфер не будет очищен. Для большинства прогрессивных консольных программ, когда их вывод захватывается. Это будет выглядеть следующим образом: ... 1%, .... 2% ..... 2% ..... 3% .... и продолжайте повторять, поэтому я очень верю, что это так. В Linux размер PIPE составляет 4096 бит, поэтому это может легко заполниться. Вы еще пытались использовать функцию Popen.communicate()? (Прочитайте раздел 17.1.2 http://docs.python.org/library/subprocess.html) – xkrz
Как вы хотите использовать функцию popen.communicatte()? –