Controlar um Console do Windows App w / stdin tubulação
-
05-09-2019 - |
Pergunta
Eu estou tentando controlar uma aplicação de consola (JTAG aplicativo da Segger) do Python usando o módulo de subprocesso. Os comporta aplicação corretamente para stdout, mas stdin não parece ser lido. Se permitir que o shell, posso digitar na entrada e controlar a aplicação, mas eu preciso fazer isso programaticamente. O mesmo código funciona bem para emitir comandos para algo como cmd.exe.
Eu estou supondo que o teclado está sendo lido diretamente em vez de stdin. Alguma idéia de como eu posso enviar a entrada de aplicação?
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()
Solução
Como shoosh diz, eu tentaria verificar se o aplicativo realmente está à procura de entrada do teclado. Se for, você pode tentar mensagem Win32 passando, ou enviá-lo a entrada de teclado via automação.
Para a rota de passagem de mensagens, você pode usar a EnumWindows função através ctypes para encontrar a janela que você está depois, em seguida, usando PostMessage para enviar mensagens WM_KEYDOWN.
Você também pode enviar a entrada do teclado via pywinauto , ou o controle ActiveX de AutoIt via win32com
Usando 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")
Outras dicas
I'm guessing that the keyboard is being read directly instead of stdin
Esta é uma suposição muito forte e antes de costurar uma solução você deve tentar verificá-lo de alguma forma. Existem diferentes níveis de fazer isso. Na verdade, dois que eu posso pensar agora:
- Esperando por eventos de teclado do principal circuito de janelas. se este é o caso, então você pode simular um teclado simplesmente enviando a janela o tipo certo de mensagem. estes podem ser
WM_KEYDOWN
murchar ouWM_CHAR
ou talvez algumas outras variantes relacionados. - Na verdade polling o hardware, por exemplo, usando
GetAsyncKeyState()
. Isso é um pouco improvável, e se este é realmente o que está acontecendo, eu duvido que você pode fazer qualquer coisa para simular lo através de programação.
Outra opinião sobre isso é tentar usar o teclado na tela e ver se ele funciona com o aplicativo. se isso acontecer, descobrir como para simular o que ele faz.
Algumas ferramentas que podem ser úteis -
- Spy ++ (vem com o Visual Studio) - permite que você veja quais mensagens entrar em uma janela
- strace permite que você veja o que syscalls um processo está a fazer.