Я попытался объединить Связать несколько команд 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 и не останавливается в обычном терминале?