Вывод Dynami c для dd & md5sum с использованием подпроцесса. ТРУБА - PullRequest
1 голос
/ 22 марта 2020

Я попытался объединить Связать несколько команд Popen с каналами и Постоянно печатать выходные данные подпроцесса во время выполнения процесса , чтобы динамически перехватить выходные данные:

sudo dd if=/dev/sdf bs=512 skip=10 count=1000000 status=progress | md5sum

В терминале это работает просто отлично. В python3 я попытался использовать подпроцесс, и было предложено Замена Shell Pipeline , чтобы связать деталь | md5sum с CMD. Вот как выглядит мой код: из подпроцесса импорта Popen, общаться, PIPE

dev = "/dev/sdf"
MD5_CMD = "sudo dd if={} bs=512 skip=10 count=1000000 status=progress | md5sum".format(dev)
tmp = Popen(MD5_CMD.split(), stderr=PIPE, stdout=PIPE, universal_newlines=True) 
process = Popen("md5sum", stdin=tmp.stdout, stdout=PIPE, stderr=PIPE, universal_newlines=True)
for line in iter(process.stdout.readline, ""):
    print(line)

Но мне не удается создать динамический c процесс - я всегда возвращаю одно значение:

>> d41d8cd98f00b204e9800998ecf8427e  -

и с помощью ps -a я вижу, что ни один процесс md5sum не запущен и не запущен. Я также пытался использовать for l in process.communicate(): print(l), но получил тот же результат - поэтому мой подход систематически неверен. Может кто-нибудь объяснить мне, почему команда «останавливается» с Popen и не останавливается в обычном терминале?

1 Ответ

0 голосов
/ 24 марта 2020

Я решил это, добавив cat и pv к команде (pv - программа, которая может просматривать каналы - apt-get install pv):

CMD = "start=10; length=$((1000000 )); "  ## skip & count in the dd
CMD += "cat /dev/sda | dd bs=512 skip="$start" "
CMD += "count="$length" | pv -fs 1000M | md5sum"

process = Popen(["bash", "-c", CMD], stdout=PIPE, stderr=PIPE, text=True)

while True:
    line = process.stderr.readline()
    if not line:
        break
    lastline = line.strip()
    STATUS.update(lastline)

Это динамически печатает вывод операции md5sum.

...