Асинхронное чтение стандартного вывода из подпроцесса. Открыть - PullRequest
6 голосов
/ 30 ноября 2009

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

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

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

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

Ответы [ 3 ]

7 голосов
/ 22 февраля 2010

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

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 и заменил строковый аргумент списком, что обычно рекомендуется.

1 голос
/ 30 октября 2011

В поисках рецепта асинхронной обработки данных Popen я наткнулся на http://code.activestate.com/recipes/576759-subprocess-with-async-io-pipes-class/

Это выглядит довольно многообещающе, однако у меня сложилось впечатление, что в нем могут быть некоторые опечатки. Еще не пробовал.

0 голосов
/ 09 апреля 2011

Это старый пост, но распространенная проблема, с которой трудно найти решение. Попробуйте это: http://code.activestate.com/recipes/440554-module-to-allow-asynchronous-subprocess-use-on-win/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...