用Python subprocess处理断言对话框

0 投票
2 回答
1309 浏览
提问于 2025-04-16 22:28

我正在用Python创建一个子进程,目的是检查程序中没有出现断言错误。

我想同时捕捉错误输出和返回代码,这个部分没问题。但是我遇到的麻烦是,当程序遇到断言错误时,会弹出一个对话框,这个对话框会一直停在那里。我必须先点击这个对话框,才能获取任何信息。有没有办法让这个对话框不弹出来,程序可以继续运行,或者发送一个消息来关闭这个窗口呢?

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

import subprocess

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

for line in pipe.stderr:
    print line

这个可执行文件是从C++代码编译而来的,里面有一个断言是为了测试目的而故意设置的,会失败。

2 个回答

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() 的地方设置一个断点。如果这个断点被触发了,就结束这个程序并返回一个合适的错误状态。不过,这种方法实在是太复杂了。

撰写回答