Pergunta

href="https://stackoverflow.com/questions/531708/logging-output-of-external-program-with-wxpython"> semelhante questions para este, mas eu gostaria de ver uma resposta esclarecida. Estou construindo uma GUI simples com PythonCard para embrulhar um processo de linha de comando. Especificamente, é um wrapper para uma série de tarefas Ant e outras operações personalizadas de modo não-devs pode usá-lo.

Eu gostaria de redirecionar a saída do subprocesso a uma TextArea na janela. Parece que a maneira de fazer isso é usar subprocess.Popen(command, stdout=subprocess.PIPE) e carregar a saída para uma variável.

A questão é como eu vivo atualizar a janela com a saída do subprocesso? Alguma dica seria bem-vinda

Graças

Foi útil?

Solução

Apenas sobre cada subprocesso pode embrulhar vai tamponar a sua saída a menos que você conseguir enganá-lo em acreditar que está realmente conectado a um terminal - e subprocess não pode fazer isso. Em vez disso, olhar para pexpect (funciona bem em todas as plataformas que lhe permite ter uma pseudoterminal, ou seja, todas as plataformas, exceto Microsoft Windows; no Windows, você pode tentar wexpect mas Eu não tenho nenhuma experiência com o último).

Estes módulos lhe dar a saída do subprocesso, logo que ele é produzido, e se esforçam para enganar o módulo para esta produção o mais rápido possível e sem tamponamento, de modo que deve tornar mais fácil para você receber essa saída em tempo real e anexá-lo o campo de texto que você deseja manter a atualização.

Outras dicas

Eu estava procurando uma solução para isso também. Acontece que a solução é extremamente simples:

proc = subprocess.Popen ( "qualquer programa", cwd = "startup dir", shell = True, stdout = subprocess.PIPE, stderr = subprocess.STDOUT)
while True:
txt = proc.stdout.readline ()
se não txt: pausa
txt = txt.replace ( "\ r \ n", "\ n"). substitua ( "\ r \ n", "\ n"). substitua ( "\\", "\")
self.components.taStdout.appendText (txt)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top