我有一个应用程序,当我给它一定的输入时崩溃。在命令行提示符下,我可以看到“访问冲突”消息等。 并且程序在处理输入时不会终止(一种非结束循环)。要杀死它,我需要输入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。
答案 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
的良好副作用。
如果此解决方案不起作用,您调用的程序可能不会刷新其输出流的缓冲区,并且您无法做到这一点。