2

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

我现在的 hack 是time.sleep()我的 python 程序 0.5 秒(如果它要这样做的话,这应该足够让子进程失败)。python程序恢复后,它会轮询子进程以确定它是否失败。

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

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

4

1 回答 1

1

两种方法:

  • 按照您自己的建议调用Popen.wait()线程,然后在退出代码非零时调用错误处理函数。确保错误处理程序是线程安全的,如果您的应用程序具有事件循环,最好将错误消息分派到主线程。
  • 重写您的应用程序以使用已经支持监视子进程的事件循环,例如pyev。如果您只想监视一个子进程,这可能是矫枉过正。
于 2012-09-03T22:21:12.573 回答