Асинхронно считайте stdout из подпроцесса. Popen

Я запускаю подпрограмму с помощью subprocess.popen. Когда я запускаю свою программу Python из командного окна (cmd.exe), программа пишет некоторую информацию и даты в окне, поскольку программа развивается.

Когда я выполняю свой код Python не в командном окне, он открывает новое командное окно для вывода этой подпрограммы, и я хочу избежать этого. Когда я использовал следующий код, он не показывает cmd окно, но он также не печатает состояние:

p = subprocess.Popen("c:/flow/flow.exe", shell=True, stdout=subprocess.PIPE)
print p.stdout.read()

Как я могу показать вывод подпрограммы в выводе своей программы, как это происходит?

6
задан 6 revs, 3 users 46% 22 February 2010 в 11:15
поделиться

1 ответ

Используйте это:

cmd = subprocess.Popen(["c:/flow/flow.exe"], stdout=subprocess.PIPE)
for line in cmd.stdout:
    print line.rstrip("\n")
cmd.wait()  # you may already be handling this in your current code

Обратите внимание, что вам все равно придется ждать, пока подпрограмма очистит свой буфер stdout (который обычно буферизуется по-разному, когда не выполняется запись в окно терминала), поэтому вы не можете сразу увидеть каждую строку поскольку подпрограмма распечатывает его (это зависит от различных деталей ОС и деталей подпрограммы).

Также обратите внимание, как я удалил shell = True и заменил строковый аргумент списком, что обычно рекомендуется.

8
ответ дан 10 December 2019 в 00:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: