Получать вывод постоянно: rsync info = progress2 вызов в скрипте Python - PullRequest
0 голосов
/ 07 марта 2019

Я вызываю 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))

1 Ответ

0 голосов
/ 11 марта 2019

Итак, я понял, что все изменение процента от 0 до 100% рассматривалось как одна строка, поскольку оно было разбито на \ r вместо \ n

self.proc.stdout.readline ()

, поэтому эта линия активируется только после того, как процесс достигнет 100%

Я переключил его на self.proc.stdout.readline (80) который работал так, как он распечатывал каждые 80 символов, давая мне обновления о преимуществах. Однако, так как длина строки меняется повсюду, я ищу лучший способ сделать это

...