не могу вывести 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 шт):
У меня получилось только прочитать прогресс из потока 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
Нашел решение: Дополнительный модуль 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)

