Python wx (Python Card) регистрирует вывод подпроцесса в окно - PullRequest
1 голос
/ 29 июля 2009

Есть похожие вопросы на этот вопрос, но я хотел бы получить уточненный ответ. Я строю простой графический интерфейс с PythonCard, чтобы обернуть процесс командной строки. В частности, это оболочка для серии ANT-задач и других пользовательских операций, поэтому не-разработчики могут использовать ее.

Я бы хотел перенаправить вывод подпроцесса в TextArea в окне. Похоже, что способ сделать это - использовать subprocess.Popen(command, stdout=subprocess.PIPE) и загрузить вывод в переменную.

Вопрос в том, как мне в прямом эфире обновить окно с выводом подпроцесса? Любые намеки приветствуются

Спасибо

Ответы [ 2 ]

1 голос
/ 28 ноября 2009

Я тоже искал решение для этого. Оказывается, решение удивительно просто:

proc = subprocess.Popen ("любая программа", cwd = "каталог запуска", shell = True, stdout = subprocess.PIPE, stderr = subprocess.STDOUT)
пока верно:
txt = proc.stdout.readline ()
если не txt: break
TXT = txt.replace ( "\ г \ п", "\ п"). заменить ( "\ г \ п", "\ п"). заменить ( "\\", "\")
self.components.taStdout.appendText (TXT)

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

Почти каждый подпроцесс, который вы можете обернуть, будет буферизовать свой вывод, если вы не сумеете обмануть его, полагая, что он действительно подключен к терминалу - а подпроцесс не может этого сделать. Скорее, посмотрите на pexpect (хорошо работает на любой платформе, которая позволяет иметь псевдотерминал, т. Е. На любой платформе, кроме Microsoft Windows; в Windows вы можете попробовать wexpect , но у меня нет опыта работы с последний).

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

...