Управление консольным приложением Windows с помощью стандартного канала - PullRequest
1 голос
/ 07 апреля 2009

Я пытаюсь управлять консольным приложением (приложение JTAG от Segger) из Python с помощью модуля подпроцесса. Приложение работает правильно для стандартного вывода, но стандартный ввод не читается. Если включить оболочку, я могу ввести данные и управлять приложением, но мне нужно сделать это программно. Тот же код прекрасно работает для выдачи команд на что-то вроде cmd.exe.

Я предполагаю, что клавиатура читается напрямую вместо стандартного ввода. Любые идеи, как я могу отправить заявку приложения?

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

Ответы [ 2 ]

3 голосов
/ 07 апреля 2009

Как говорит шош, я бы попробовал проверить, действительно ли приложение ищет ввод с клавиатуры. Если это так, вы можете попробовать передать сообщения Win32 или отправить его с клавиатуры с помощью автоматизации.

Для маршрута передачи сообщений вы можете использовать функцию EnumWindows через ctypes, чтобы найти нужное окно, а затем использовать 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")
2 голосов
/ 07 апреля 2009
I'm guessing that the keyboard is being read directly instead of stdin

Это довольно сильное предположение, и перед тем, как сшить решение, попробуйте как-нибудь проверить его. Есть разные уровни для этого. На самом деле я могу вспомнить о двух:

  • Ожидание событий клавиатуры из цикла главных окон. в этом случае вы можете смоделировать клавиатуру, просто отправив в окно правильное сообщение. это могут быть WM_KEYDOWN или WM_CHAR или, возможно, некоторые другие связанные варианты.
  • Фактический опрос оборудования, например, с использованием GetAsyncKeyState(). Это несколько маловероятно, и если это действительно то, что происходит, я сомневаюсь, что вы можете сделать что-нибудь, чтобы симулировать это программно.

Еще один пример - попытка использовать экранную клавиатуру и посмотреть, работает ли она с приложением. если это так, выясните, как имитировать то, что он делает.

Некоторые инструменты, которые могут быть полезны -

  • Spy ++ (поставляется с Visual Studio) - позволяет увидеть, какие сообщения попадают в окно
  • strace позволяет увидеть, какие системные вызовы выполняет процесс.
...