1

subprocess モジュールを使用して Python からコンソール アプリケーション (Segger の JTAG アプリ) を制御しようとしています。アプリケーションは stdout に対して正しく動作しますが、stdin は読み取られないようです。シェルを有効にすると、入力に入力してアプリケーションを制御できますが、これはプログラムで行う必要があります。同じコードは、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()
4

2 に答える 2

3

shoosh が言うように、アプリケーションが実際にキーボード入力を探していることを確認しようと思います。そうである場合は、Win32 メッセージ パッシングを試すか、オートメーションを介してキーボード入力を送信することができます。

メッセージ パッシング ルートの場合、ctypes を介してEnumWindows関数を使用して目的のウィンドウを見つけ、PostMessage を使用して WM_KEYDOWN メッセージを送信できます。

pywinauto経由でキーボード入力を送信したり、win32com 経由でAutoItの ActiveX コントロールを送信したりすることもできます。

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")
于 2009-04-07T00:16:30.143 に答える
2
I'm guessing that the keyboard is being read directly instead of stdin

これは非常に強い仮定であり、解決策をまとめる前に何らかの方法で検証する必要があります。これを行うにはさまざまなレベルがあります。実際、今思いつくのは次の2つです。

  • メイン ウィンドウ ループからのキーボード イベントを待機しています。この場合、ウィンドウに適切な種類のメッセージを送信するだけで、キーボードをシミュレートできます。これらは枯れているWM_KEYDOWNか、WM_CHARまたはおそらく他の関連する亜種である可能性があります。
  • たとえば、を使用して、実際にハードウェアをポーリングしますGetAsyncKeyState()。これはややありそうになく、これが実際に起こっていることである場合、プログラムでシミュレートするために何かできるとは思えません。

これに対するもう 1 つの方法は、スクリーン キーボードを使用して、それがアプリケーションで動作するかどうかを確認することです。もしそうなら、それが何をするかをシミュレートする方法を見つけてください。

役立つかもしれないいくつかのツール -

  • Spy++ (Visual Studio に付属) - ウィンドウに表示されるメッセージを確認できます
  • straceを使用すると、プロセスが作成している syscall を確認できます。
于 2009-04-06T22:40:50.060 に答える