2011-07-28 31 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()時調用一個斷點。如果該斷點被擊中,則終止該進程並返回適當的錯誤狀態。但這是一個極端不平凡的混合物。