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()
Foi útil?

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 ou WM_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.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top