2009-04-06 12 views
1

サブプロセスモジュールを使用してPythonからコンソールアプリケーション(SeggerのJTAGアプリケーション)を制御しようとしています。アプリケーションはstdoutに対して正しく動作しますが、stdinは読み込まれていないようです。シェルを有効にすると、入力を入力してアプリケーションを制御できますが、プログラムでこれを行う必要があります。同じコードは、cmd.exeのようなものにコマンドを発行するのにうまく機能します。Windowsコンソールアプリケーションをstdinパイプで制御する

私はキーボードが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

私は、アプリケーションが実際にキーボード入力を探していることを確認しようとしています。そうであれば、Win32メッセージの受け渡しを試みるか、またはキーボード入力を自動化を介して送ることができます。

メッセージの受け渡しルートについては、ctypesを使用してEnumWindows関数を使用して、表示しているウィンドウを見つけてから、PostMessageを使用してWM_KEYDOWNメッセージを送信することができます。

キーボード入力をpywinauto、またはAutoItのActiveXコントロールを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 

これはかなり強い仮定であるとソリューションをステッチする前に、あなたは何とかそれを確認してみてください。これにはさまざまなレベルがあります。実際には私は今思うことが2つあります:

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

もう1つは、オンスクリーンキーボードを使用してアプリケーションで動作するかどうかを確認することです。そうであれば、それが何をシミュレートするかを理解する。

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

  • スパイ++(Visual Studioのが付属しています) - あなたは窓
  • straceに入る何のメッセージを確認することができますあなたが作っているどのようなプロセスをのsyscalls見ることができます。
+0

プログラムは、代わりに標準入力を見てWM_KEYDOWN/WM_CHARメッセージイベントを聞いているように見えるん。 私はStraceNTを認識していませんでした - ありがとう! –

関連する問題