【问题标题】:Python - Continue program after program crashPython - 程序崩溃后继续程序
【发布时间】:2017-02-04 16:40:39
【问题描述】:

我有一个应用程序在我给它某个输入时崩溃。在命令行提示符下,我可以看到“访问冲突”消息等。 并且程序在处理输入时不会终止(一种没有结束的循环)。要杀死它,我需要按 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 库的建议、概念或提示,以解决我的问题。您不需要编写代码 sn-ps。

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

【问题讨论】:

  • 你可以试试subprocess.call([program_to_call, arg, file]),因为 Popen 需要等待终止。
  • 是的,但我还想捕获错误消息以决定它是否崩溃。因此,我使用了 code = subprocess.check_output(...) 但它挂了。
  • 错误信息可能会写入标准输出。尝试使用参数stderr=sys.stdout 调用subprocess.check_output 是否有效。
  • @L3viathan:是的,我可以在命令提示符下看到错误代码。

标签: python crash


【解决方案1】:

首先你需要弄清楚程序是把错误信息写入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

如果此解决方案不起作用,您调用的程序可能不会刷新其输出流的缓冲区,您对此无能为力。

【讨论】:

  • 是的,谢谢。我还在无限循环中使用简单的 try/except 块解决了这个问题。但是使用您的解决方案,我会存储返回码,例如code = p.returncodebreak 关键字之前,也很不错。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-02
  • 2012-04-16
相关资源
最近更新 更多