не могу вывести stdout другой программы

Есть код:

system = subprocess.Popen([r"C:\Program Files\7-Zip\7z.exe", "t", filename, f"-p{password}"],
stderr=subprocess.STDOUT, stdout=subprocess.PIPE)
output = str(system.communicate()[0])

Тут я запускаю 7zip и хочу увидеть его работу, он когда работает в cmd (не из питона) - показывает шкалу выполнения в процентах и потом выводит данные которые у меня в output .

Как мне из питона заставить показать как работает 7zip? Всё работает и так, но невидно процесса. Непонятно висит или нет.

Хочу видеть так


Ответы (2 шт):

Автор решения: Peter Lavreniuk

У меня получилось только прочитать прогресс из потока stderr, по этому поводу ответ есть тут : EnSO

Во первых необходимо сказать 7z что бы он писал progress в stderr, командой -bsp2. Подробнее о команде тут : -bs (Set output stream for output/error/progress line) switch

Затем я просто в цикле читаю сначала stdout, потом stderr. Если что то есть из этих двух - вывожу, если ничего нет - выхожу из цикла. Кстати там прогресс он пишет в одну строку разделяя \r. Я вывод подправил чтобы он делал вывод построчно!

proc = subprocess.Popen([r"C:\Program Files\7-Zip\7z.exe", "e", r"C:\test123\pycharm-community-2020.2.2.7z",
                             r"-oC:\test123\test", "-aoa", "-bsp2"],
                            stderr=subprocess.PIPE, stdout=subprocess.PIPE)

while True:
    line = proc.stdout.readline()
    if line:
        print(line.rstrip())
    else:
        line = proc.stderr.readline()
        if line:
            progress = list(filter(lambda x: x.strip(), line.decode().split("\r")))
            print("\n".join(progress))
        else:
            break

введите сюда описание изображения

→ Ссылка
Автор решения: Sergey Khripushin

Нашел решение: Дополнительный модуль subpiper

from subpiper import subpiper

def my_stdout_callback(line: str): print(f'STDOUT: {line}')

def my_stderr_callback(line: str): print(f'STDERR: {line}')

retcode = subpiper(cmd=r'C:\Program Files\7-Zip\7z.exe x D:\backup\1.7z -oD:\test -aoa -bsp2', stdout_callback=my_stdout_callback, stderr_callback=my_stderr_callback)

→ Ссылка