Запуск нескольких процессов и захват вывода в python с помощью pygtk - PullRequest
1 голос
/ 22 мая 2009

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

Я пытался реализовать это двумя способами в python, первый из которых использовал subprocess.Popen, а второй - vte (python-vte).

Я только заставил Попена работать с опросами. Я должен постоянно проверять, есть ли у процессов данные для чтения, читать данные, а затем отправлять их в мой TextArea. Вместо этого было рекомендовано использовать gobject.io_add_watch (), но всякий раз, когда я пытаюсь, чтобы моя программа зависала при втором вызове io_add_watch - все равно, что он может обрабатывать только один дескриптор файла одновременно.

vte прекрасно работает, но я не нашел надежного способа получения выходных данных. Вы можете получить обратный вызов, когда курсор переместится, а затем очистить экран w / get_text (), но я уже сталкивался со случаями, когда эти программы, которые я просматриваю, генерируют непристойное отношение к tty за один раз, а затем оно исчезает с экрана. Похоже, что нет обратного вызова, содержащего новый текст, добавляемый в окно.

Есть идеи?

Ответы [ 3 ]

1 голос
/ 22 мая 2009

Если вы согласитесь с предложением игкука, я получил несколько полезных советов по просмотру файлов на предмет изменений в связанном вопросе. Это хорошо сработало для меня (я смотрел файл журнала на предмет изменений).

1 голос
/ 22 мая 2009

Я сделал нечто подобное, используя подпроцесс . Откройте . Для каждого процесса я фактически перенаправлял stdout и stderr во временный файл, затем периодически проверял файл на наличие обновлений и выводил вывод в TextView .

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

Как выяснилось, иногда я хотел бы сохранить выходные данные определенного процесса, поэтому этот метод работал хорошо для меня.

0 голосов
/ 22 мая 2009

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

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