Pregunta

Estoy tratando de controlar una aplicación de consola (JTAG aplicación de Segger) de Python usando el módulo de subproceso. La aplicación se comporta correctamente para la salida estándar, pero no parece la entrada estándar para ser leído. Si habilitar la cáscara, puedo escribir en la entrada y el control de la aplicación, pero tengo que hacerlo mediante programación. El mismo código funciona bien para emitir comandos a algo así como cmd.exe.

supongo que el teclado está siendo leído directamente en lugar de la entrada estándar. Alguna idea de cómo puedo enviar la solicitud de entrada?

from subprocess import Popen, PIPE, STDOUT
jtag = Popen('"C:/Program Files/SEGGER/JLinkARM_V402e/JLink.exe"', shell=True,
                        universal_newlines=True,
                        stdin=PIPE,
                        stdout=PIPE,
                        stderr=STDOUT)

jtag.stdin.write('usb\n')
jtag.stdin.flush()

print "Stdout:"
while True:
    s = jtag.stdout.readline()
    if not s:
        break
    print s,

jtag.terminate()
¿Fue útil?

Solución

Como dice shoosh, me gustaría probar para verificar que la aplicación realmente está buscando la entrada de teclado. Si es así, puede intentar mensaje de Win32 que pasa, o enviarlo a través de la automatización de entrada del teclado.

En la ruta paso de mensajes, se puede utilizar la EnumWindows ctypes función a través de la ventana para encontrar lo que busca, a continuación, utilizando PostMessage para enviar mensajes que WM_KEYDOWN.

También puede enviar a través de la entrada de teclado pywinauto , o el control ActiveX de AutoIt través win32com

El uso de AutoIt:

from win32com.client import Dispatch

auto = Dispatch("AutoItX3.Control")
auto.WinActivate("The window's title", "")
auto.WinWaitActive("The window's title", "", 10)

auto.Send("The input")

Otros consejos

I'm guessing that the keyboard is being read directly instead of stdin

Esta es una suposición bastante fuerte y antes de coser una solución que debe tratar de verificar de alguna manera. Hay diferentes niveles de hacer esto. En realidad dos que se me ocurre en este momento:

  • A la espera de los eventos de teclado desde el bucle principal de ventanas. si este es el caso, entonces se puede simular un teclado simplemente mediante el envío de la ventana de la clase correcta de mensaje. estos pueden ser WM_KEYDOWN marchitan o WM_CHAR o tal vez algunas otras variantes relacionadas.
  • En realidad el hardware de votación, por ejemplo usando GetAsyncKeyState(). Esto es algo poco probable, y si esto es realmente lo que está pasando, dudo que se puede hacer nada para simular mediante programación.

Otra toma en esto está tratando de utilizar el teclado en pantalla y ver si funciona con la aplicación. si lo hace, la manera de simular lo que hace.

Algunas herramientas que podrían ser útiles -

  • Spy ++ (viene con Visual Studio) - le permite ver los mensajes que entran en una ventana
  • strace le permite ver lo que un proceso de llamadas al sistema está haciendo.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top