Как мне дождаться завершения подпроцесса, сохранить его выходные данные и добавить префикс (без новой строки) к выходным данным? - PullRequest
1 голос
/ 15 марта 2019

У меня есть скрипт Python (3), который вызывает внешнюю команду, используя метод subprocess.call([...]):

import subprocess

print("Prefix: ")
subprocess.call(["cmd", "--option", "filename.x"])

Команда выполняется без ошибок, но проблема в выводе.

Вывод не «равномерный» и иногда программа выдаст:

Program output...
Prefix:

И в других случаях результат будет:

Prefix:
Program output....

Результат, который я ищу:

Prefix: Program output...

Я знаю, что для достижения этого результата мне нужно дождаться завершения подпроцесса, сохранить его вывод и затем распечатать префикс (без \n) с выводом подпроцесса после него, я просто не могу понять как сделать это.

Спасибо.

1 Ответ

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

Сначала вам нужно импортировать модуль sys, чтобы вы могли использовать методы sys.stdout write и flush.

import sys

Вам также необходимо импортировать модуль подпроцесса, чтобы можно было использовать метод subprocess.check_output.

import subprocess

Используйте sys.stdout.write вместо print:

sys.stdout.write("Prefix: ")

Затем вам нужно заменить subprocess.call на subprocess.check_output, который запускает данную команду и ждет вывода.

response = subprocess.check_output(["cmd", "--option", "filename.x"])

ПРИМЕЧАНИЕ: вам нужно декодировать ответ, потому что это байтовый объект, а не строка.

sys.stdout.write(response.decode("UTF-8"))

И, наконец, вам нужно сбросить вывод:

sys.stdout.flush()

Вот окончательный результат:

import sys, subprocess
sys.stdout.write("Prefix: ")
response = subprocess.check_output(["cmd", "--option", "filename.x"])
sys.stdout.write(response.decode("UTF-8"))
sys.stdout.flush()

Удачи, надеюсь, никто больше не споткнется в этом вопросе, как я.

...