Я вызываю rsync с помощью popen, и выходные данные не выводятся непрерывно в моем скрипте python для моего веб-приложения, как в обычном linux. Я пытаюсь скопировать все файлы из одного каталога в другой (массовое копирование). Я хочу использовать номера прогресса, полученные при изменении выходных данных, чтобы в конечном итоге создать / обновить индикатор выполнения, который есть в моем веб-приложении. Все, что мне нужно, это общий прогресс всей копии, поэтому я бы использовал --info = progress2 в моей команде rsync.
Я также попробовал:
while True:
line = self.proc.stdout.readline()
if line != '':
# the real code does filtering here
print("test:", line.rstrip())
else:
break
но ждал до конца, чтобы просто напечатать тест: b ''
Я думаю, что проблема заключается либо в цикле while, извлекающем данные, либо в том, как я печатаю его на своей консоли, используя другой класс.
Существует не так много информации об использовании этого --info = progress2
так как это относительно новое обновление.
Вот мой код.
import subprocess
import logging
import sys
import os
import replicator.dfp.rep_utils as ru
class SyncProcessor(object):
def __init__(self, src, dest):
self.src = src
self.dest = dest
self.proc = None
self.callback = None
log_file = "sync-{}-{}.log".format(self.src, self.dest)
self.sync_logger = ru.setup_logger(__file__, log_file, level=logging.DEBUG)
def add_sync_callback(self, cb):
self.callback = cb
def run(self):
print("Syncing Drive "+ str(self.src.driveNum) + " to Drive " + str(self.dest.driveNum))
rsync_cmd = "sudo rsync -ah --info=progress2 --delete --stats /media/drive{}/ /media/drive{}".format(self.src.driveNum, self.dest.driveNum)
self.proc = subprocess.Popen(rsync_cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
while self.proc.poll() is None:
output = self.proc.stdout.readline()
if output == '':
break
if output:
print("OUTPUT DECODE: " + output.decode("utf-8")
#self.sync_logger.info(output.decode())
self.callback.update(output.decode())
print("<< Finished Syncing >>")
#self.sync_logger.debug("<< Finished Syncing >>")
rc = self.proc.poll()
#self.sync_logger.debug("Return code: {}".format(rc))
os.system("sync")
return rc
def communicate(self):
return self.proc.communicate()
class Progress(object):
"""Callback to report progress of a SyncProcessor"""
def __init__(self, src, dest, out=sys.stdout):
self.src = src
self.dest = dest
self.out = out
def update(self, data):
line = "From Progress({}-{}) -> {}"
self.out.write(line.format(self.src, self.dest, data))