2009-04-06 4 views
1

하위 프로세스 모듈을 사용하여 Python에서 콘솔 응용 프로그램 (Segger의 JTAG 응용 프로그램)을 제어하려고합니다. 응용 프로그램이 stdout에 대해 올바르게 작동하지만 stdin이 읽지 않은 것 같습니다. 셸을 활성화하면 입력을 입력하고 응용 프로그램을 제어 할 수 있지만 프로그래밍 방식으로이 작업을 수행해야합니다. 동일한 코드가 cmd.exe와 같은 명령을 실행하는 데 적합합니다.Windows 콘솔 응용 프로그램 제어 stderin 파이프

키보드가 stdin 대신 직접 읽혀지고 있다고 생각합니다. 어떻게 응용 프로그램 입력을 보낼 수있는 아이디어?

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() 

답변

3

shoosh는 애플리케이션이 실제로 키보드 입력을 찾고 있는지 확인하려고합니다. 그럴 경우 Win32 메시지 전달을 시도하거나 자동화를 통해 키보드 입력을 보낼 수 있습니다.

메시지 전달 경로의 경우 ctypes를 통해 EnumWindows 함수를 사용하여 나중의 창을 찾은 다음 PostMessage를 사용하여 WM_KEYDOWN 메시지를 보낼 수 있습니다.

키보드 입력을 pywinauto으로 보내거나 ActiveX 컨트롤 AutoIt을 통해 win32com을 통해 보낼 수도 있습니다. 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") 
+0

이 코드는 작동합니다. 유일한 문제는 사용자가 어딘가를 클릭하면 입력 포커스가 느슨해 지므로 숨김 상태로 유지하는 대신 외부 터미널을 열어야한다는 것입니다. 자식 프로세스가 숨겨진 상태로 유지하면서이 작업을 수행하는 방법에 대한 의견이 있습니까? –

+0

EnumWindows -> PostMessage (hwnd, WM_KEYDOWN, ...)는 문제가 자식 프로세스가 키 입력에서 입력을 읽는 것이고 stdin이 아니라면 자식 프로세스를 숨겨 지도록 허용해야합니다. –

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

이 꽤 강한 가정하고 해결책을 봉합하기 전에 어떻게 든 그것을 확인하기 위해 시도해야합니다. 이렇게하는 데는 여러 단계가 있습니다. 실제로 두 가지를 생각해 볼 수 있습니다 :

  • 메인 윈도우 루프에서 키보드 이벤트를 기다리고 있습니다. 이 경우 윈도우에 올바른 종류의 메시지를 보내어 키보드를 시뮬레이션 할 수 있습니다. 이것들은 WM_KEYDOWN 또는 WM_CHAR이거나 아마도 다른 관련 변형 들일 수 있습니다.
  • 하드웨어를 실제로 폴링합니다 (예 : GetAsyncKeyState() 사용). 이것은 다소 어려울 것입니다. 그리고 이것이 실제로 진행되고 있다면, 당신이 프로그램 적으로 시뮬레이션하기 위해 무엇이든 할 수 있을지는 의문입니다.

또 다른 문제는 화면 키보드를 사용하여 응용 프로그램과 호환되는지 확인하는 것입니다. 그렇다면, 그것이 무엇을하는지 어떻게 시뮬레이트하는지 알아 내라. 도움이 될 수

일부 도구 -

  • 스파이 ++ (Visual Studio를 함께 제공가) - 당신이
  • strace 당신이 과정을 만드는 것을 콜 볼 수있는 창으로 이동 어떤 메시지를 볼 수 있습니다.
+0

이 프로그램은 대신 표준 입력을보고 WM_KEYDOWN/WM_CHAR 메시지 이벤트를 청취 한 것으로 나타났습니다 않습니다. 나는 StraceNT에 대해 몰랐다. - 고마워! –

관련 문제