使用python子进程处理断言对话框

时间:2011-07-28 22:18:43

标签: python subprocess assert

我正在使用python创建一个子进程来检查并发现没有断言发生。

我想捕获错误输出以及返回码。这工作正常,但我遇到的问题是,当它遇到断言时,它给了我一个只挂在那里的对话框。在检索任何信息之前,我必须单击断言框。有没有办法让它不弹出并继续程序或发送消息关闭窗口?

这是一个问题,因为这是一个自动化服务。

import subprocess

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

for line in pipe.stderr:
    print line

可执行文件是从c ++代码编译的,并且有一个断言会因测试目的而失败。

2 个答案:

答案 0 :(得分:1)

一般来说,实际上并不是一个简单的解决方案,因为理论上程序可以创建任意数量的窗口等待用户输入。如果您拥有劣质流程的源代码,最简单的方法是修改它以调用_set_abort_behavior(0, _CALL_REPORTFAULT)来禁用消息框。

如果您没有源代码,那将会变得更加困难。您可能会编写一个大型的黑客程序,例如将调试程序附加到劣质进程并在调用abort()时设置断点。如果该断点被命中,则终止该进程并返回适当的错误状态。但这是一个非常重要的非常重要的因素。

答案 1 :(得分:0)

正如我在评论中提到的,断言的弹出窗口在Python中并不常见。如果你可以修改在子进程中运行的代码,你可能能够捕获断言并自己处理它,而不是让环境通过弹出窗口处理它。

import sys

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

如果它特别寻找断言,这应该有效,因为它将捕获断言,打印错误消息,然后引发一个简单的SystemExit异常。