Python - 程序崩溃后继续执行程序

时间:2017-02-04 16:40:39

标签: python crash

我有一个应用程序,当我给它一定的输入时崩溃。在命令行提示符下,我可以看到“访问冲突”消息等。 并且程序在处理输入时不会终止(一种非结束循环)。要杀死它,我需要输入Ctrl + C.

  

我的问题是:如何以编程方式跳过崩溃?

     

我的意思是:我的目标是将该输入提供给该程序,如果它崩溃我   想要存储输入,如果它没有崩溃,那么我将删除   输入并继续下一个输入?

我的代码是:

import subprocess


program_to_call = "C:\\Program Files\\Software\\application.exe"
arg = "-s"

file = "C:\\Users\\test\\Desktop\\Project\\templates\\file1"

subprocess.Popen([program_to_call, arg, file], shell=True)   # <---after this line, it does not go to next line 

... code for removing etc. 

由于我正在学习Python,我希望在你的答案中看到有用的python库的一些建议,概念或提示。您不需要编写代码片段。

注意:我使用的是Windows 7(x86),安装的python版本是2.7.1。

1 个答案:

答案 0 :(得分:0)

首先,您需要弄清楚程序是否将错误消息写入STDERR或STDOUT。然后,您必须希望在打印错误消息后刷新其缓冲区。最后,你可以这样做:

p = subprocess.Popen([program_to_call, ...], stdout=subprocess.PIPE)  # or stderr=...
while True:
    out, err = p.communicate()
    # now check whether error message is in out (or err)
    if p.returncode is not None: # process is dead
        break

如果您给出参数stdout=subprocess.PIPE(类似于stderr),它将使您可以根据需要检查文本的输出。这可以通过从文件对象p.stdout读取,或使用p.communicate()来完成,如果进程不再有,p.returncode具有填充img.onload的良好副作用。

如果此解决方案不起作用,您调用的程序可能不会刷新其输出流的缓冲区,并且您无法做到这一点。