我正在使用python创建一个子进程来检查并发现没有断言发生。
我想捕获错误输出以及返回码。这工作正常,但我遇到的问题是,当它遇到断言时,它给了我一个只挂在那里的对话框。在检索任何信息之前,我必须单击断言框。有没有办法让它不弹出并继续程序或发送消息关闭窗口?
这是一个问题,因为这是一个自动化服务。
import subprocess
pipe = subprocess.Popen('test2.exe', shell=True, stderr=subprocess.PIPE)
for line in pipe.stderr:
print line
可执行文件是从c ++代码编译的,并且有一个断言会因测试目的而失败。
答案 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
异常。