在python中侦听子进程失败

时间:2012-08-08 19:53:55

标签: python subprocess popen

使用subprocess.Popen(),我正在启动一个应该花费很长时间的过程。但是,该进程有可能在启动后不久失败(生成返回代码1)。如果发生这种情况,我想拦截失败并向用户提供解释性消息。有没有办法“监听”流程并在流程失败时做出响应?我不能只使用Popen.wait(),因为我的python程序必须继续运行。

我现在所使用的黑客是time.sleep()我的python程序.5秒(这应该足够让子进程失败,如果它会这样做)。 python程序恢复后,它会轮询子进程以确定它是否已经失败。

我认为更好的解决方案可能会使用线程和Popen.wait(),但我是python的初学者。

编辑: 子进程是我正在启动的Java守护进程。如果守护程序的另一个实例已在系统上运行,则Java子进程将以返回码1退出,并且我想拦截凌乱的Java异常堆栈跟踪并向用户提供可理解的错误消息。

1 个答案:

答案 0 :(得分:1)

两种方法:

  • 按照自己的建议在线程上调用Popen.wait(),如果退出代码非零,则调用错误处理函数。确保错误处理程序是线程安全的,最好是在应用程序有事件循环时将错误消息分派给主线程。
  • 重写您的应用程序以使用已支持监视子进程的事件循环,例如pyev。如果您只想监视一个子进程,这可能有点过分。