python - Kontrollerer en Windows Console App m/stdin pipe

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at styre en konsol applikation (JTAG app fra Segger) fra Python ved hjælp af subprocess modulet. Programmet opfører sig korrekt for stdout, men stdin synes ikke at være læst. Hvis aktivere skallen, kan jeg skrive ind i indgangen og styre applikationen, men jeg skal gøre det programmatisk. Den samme kode fungerer fint for udstedelse af kommandoer til noget som cmd.exe.


Jeg gætter på, at tastaturet læses direkte i stedet for stdin. Har du ideer om, hvordan jeg kan sende ansøgningsindgangen?


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
')
jtag.stdin.flush()

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

jtag.terminate()

Bedste reference


Som shoosh siger, prøver jeg at kontrollere, at applikationen virkelig leder efter tastaturindgang. Hvis det er, kan du prøve Win32-meddelelsen, eller sende det tastaturindgang via automatisering.


For meddelelsen, der sender rute, kan du bruge EnumWindows-funktionen via ctypes til at finde vinduet, du 're after' og derefter bruge PostMessage til at sende det WM\_KEYDOWN-meddelelser. [7]


Du kan også sende tastaturindgang via pywinauto eller ActiveX-styringen af ​​AutoIt via win32com. [8] [9]


Brug af 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")

Andre referencer 1


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


Dette er en ret stærk antagelse, og inden du syr en løsning, skal du prøve at bekræfte det på en eller anden måde. Der er forskellige niveauer af at gøre dette. Faktisk to kan jeg tænke på lige nu:



  • Venter på tastaturhændelser fra hovedvinduet. Hvis dette er tilfældet, kan du simulere et tastatur ved blot at sende vinduet den rigtige form for besked. disse kan være visne WM\_KEYDOWN eller WM\_CHAR eller måske nogle andre relaterede varianter.

  • Faktisk afstemning af hardware, f.eks. ved hjælp af GetAsyncKeyState(). Det er noget usandsynligt, og hvis det virkelig er hvad der foregår, tvivler jeg på, at du kan gøre noget for at simulere det programatisk.



En anden påtage sig dette forsøger at bruge tastaturet på skærmen og se om det virker med applikationen. hvis det gør det, find ud af hvordan man kan simulere hvad det gør.


Nogle værktøjer, som kan være nyttige -



  • Spy ++ (leveres med Visual Studio) - giver dig mulighed for at se, hvilke meddelelser der går i et vindue

  • [10] strace giver dig mulighed for at se, hvad syscalls en proces gør.