使用 subprocess.Popen(),我正在启动一个应该需要很长时间的进程。但是,该进程有可能会在启动后不久失败(生成 1 的返回码)。如果发生这种情况,我想拦截失败并向用户显示一条解释性消息。有没有办法“听”流程并在失败时做出响应?我不能只使用 Popen.wait() 因为我的 python 程序必须继续运行。
我现在采用的方法是让我的 python 程序 time.sleep() 持续 0.5 秒(如果子进程要这样做的话,这应该有足够的时间让其失败). python 程序恢复后,它会轮询子进程以确定它是否失败。
我想更好的解决方案可能是使用线程和 Popen.wait(),但我是 python 的初学者。
编辑: 子进程是我正在启动的 Java 守护进程。如果守护进程的另一个实例已经在系统上运行,则 Java 子进程将退出并返回代码 1,我想拦截困惑的 Java 异常堆栈跟踪并向用户呈现可理解的错误消息。
请您参考如下方法:
两种方法:
- 按照您自己的建议在线程上调用
Popen.wait(),然后如果退出代码不为零则调用错误处理函数。确保错误处理程序是线程安全的,如果您的应用程序有事件循环,最好将错误消息分派(dispatch)到主线程。 - 重写您的应用程序以使用已经支持监控子进程的事件循环,例如 pyev .如果您只想监控一个子流程,这可能有点矫枉过正。
