Pregunta

Hay similar preguntas a esta, pero me gustaría ver una respuesta aclarada. Estoy creando una interfaz gráfica de usuario simple con PythonCard para envolver un proceso de línea de comandos. Específicamente, es una envoltura para una serie de tareas ANT y otras operaciones personalizadas para que los desarrolladores no puedan usarla.

Me gustaría redirigir la salida del subproceso a un TextArea en la ventana. Parece que la forma de hacerlo es usar subprocess.Popen (command, stdout = subprocess.PIPE) y cargar la salida en una variable.

La pregunta es, ¿cómo vivo la ventana con el resultado del subproceso? Cualquier sugerencia sería bienvenida

Gracias

¿Fue útil?

Solución

Casi todos los subprocesos que puede envolver almacenarán en búfer su salida, a menos que logre engañarlo creyendo que realmente está conectado a un terminal, y el subproceso no puede hacerlo. Más bien, busque en pexpect (funciona bien en todas las plataformas que le permiten tener un pseudoterminal, es decir, todas las plataformas excepto Microsoft Windows; en Windows puede probar wexpect pero No tengo experiencia con este último).

Estos módulos le brindan la salida del subproceso tan pronto como se produce, y se esfuerzan por engañar al módulo para que produzca esa salida lo antes posible y sin almacenamiento en búfer, por lo que deberían facilitar la recepción de esa salida en tiempo real y agregarla a el campo de texto que desea mantener actualizado.

Otros consejos

También estaba buscando una solución para esto. Resulta que la solución es notablemente simple:

proc = subprocess.Popen (" cualquier programa " ;, cwd = " startup dir " ;, shell = True,     stdout = subprocess.PIPE, stderr = subprocess.STDOUT)
mientras que True
    txt = proc.stdout.readline ()
    si no es txt: romper
    txt = txt.replace (" \ r \ n ", " \ n "). replace (" \ r \ n ", " \ n "). replace (" \\ ", " \ ")
    self.components.taStdout.appendText (txt)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top