Печать Python StdOut, как он получен - PullRequest
2 голосов
/ 20 июля 2009

Я пытаюсь запустить wrap простого (windows) инструмента командной строки в приложении PyQt GUI, которое я пишу. Проблема, с которой я столкнулся, состоит в том, что инструмент командной строки выводит свой прогресс в стандартный вывод (это команда сброса сервера, поэтому вы получаете вывод типа «Попытка остановить» и «Перезапуск».

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

import os
import subprocess as sub
cmd = "COMMAND LINE APP NAME -ARGS"
proc = sub.Popen(cmd, shell=True, stdout=sub.PIPE).stdout
while 1:
    line = proc.readline()
    if not line: 
        break
print line

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

Есть простой ответ?

Ответы [ 2 ]

1 голос
/ 20 июля 2009

Интерактивное общение через stdin / stdout является распространенной проблемой.

Но вам повезло, с PyQt вы можете использовать QProcess, как описано здесь: http://diotavelli.net/PyQtWiki/Capturing_Output_from_a_Process

0 голосов
/ 29 июля 2009

Я понимаю вопрос? Я полагаю, что вы выполняете что-то вроде «эхо сначала; сон 60; эхо второе», и вы хотите видеть «первого» намного впереди «второго», но они оба выплевывают в одно и то же время.

Причина, по которой у вас возникают проблемы, заключается в том, что операционная система сохраняет выходные данные процессов в своей памяти. Отправка вывода в вашу программу будет выполняться только после заполнения буфера или завершения другой программы. Итак, нам нужно покопаться в O / S и выяснить, как сказать «Эй, дай мне это!» Это обычно называется асинхронным или неблокирующим режимом.

К счастью, кто-то сделал тяжелую работу для нас. Этот парень добавил методы send () и recv () во встроенный класс Python Popen. Похоже, он исправил ошибки, найденные в комментариях.

Попробуйте: http://code.activestate.com/recipes/440554/

...