2011-07-28 10 views
0

私は、アサーションが発生していないことを確認して確認するサブプロセスを作成するためにpythonを使用しています。アサーションダイアログボックスをpythonサブプロセスで処理する

エラー出力と戻りコードをキャッチしたいと思います。それは正常に動作しますが、私が実行する問題は、アサーションに実行されると、そこにハングするダイアログボックスが表示されることです。私は任意の情報を取得する前にアサーションボックスをクリックする必要があります。ポップアップしないでプログラムを続行するか、ウィンドウを閉じるメッセージを送信する方法はありますか?

これは自動化サービスであるため、これは問題です。

import subprocess 

pipe = subprocess.Popen('test2.exe', shell=True, stderr=subprocess.PIPE) 

for line in pipe.stderr: 
    print line 

実行ファイルは、C++コードからコンパイルされ、テスト目的では失敗するアサーションがあります。

+1

あなたのコードを実行しているPython環境は何ですか?私はアサーションに関連付けられたポップアップを持っていません。 –

+0

申し訳ありませんが、私は明確にすべきでした。 Popenで実行可能ファイルを呼び出す – Nicholas

答えて

0

コメントで述べたように、アサーションのポップアップはPythonでは普通のことではありません。サブプロセスで実行されているコードを変更することができれば、環境でポップアップを処理するのではなく、アサーションをキャプチャして自分で処理することができます。

import sys 

try: 
    code that raises the assertion 
catch AssertionError, e: 
    sys.stderr.write("Assertion failed: " + str(e)) 
    sys.exit(1) 

それは特にアサーションを探しているならば、これは動作するはずです、それは、アサーションをキャプチャし、エラーメッセージを出力して、代わりにシンプルなSystemExit例外が発生しますので。

1

プログラムでは、理論上、ユーザーの入力を待つ任意の数のウィンドウを作成できるので、一般的には簡単な解決策はありません。下位プロセスのソースコードがある場合、メッセージボックスを無効にするには、_set_abort_behavior(0, _CALL_REPORTFAULT)を呼び出すように変更するのが最も簡単です。

ソースコードをお持ちでない場合は、はるかに難しくなります。おそらく、下位プロセスにデバッガを接続し、呼び出し時にブレークポイントをabort()に設定するような大きなハックを書くことができます。そのブレークポイントにヒットした場合は、プロセスを終了して適切なエラーステータスを返します。しかし、それは極端ではありません。