Python:启动子进程作为守护进程并等待启动

时间:2015-04-23 21:21:40

标签: python subprocess

我有一些python代码依赖于外部服务器运行。在启动时,服务器向STDOUT输出一个字符串,表明它已准备好接收请求。我希望做的是,从我的python代码,启动服务器,等待输出字符串,运行我的其余python代码,然后关闭服务器。然而,到目前为止,我能够弄清楚如何做到a)启动服务器并立即继续(创建通常失败的竞争条件),或b)启动服务器并等待它完成(从不发生,因为它是一个服务器)

有没有办法启动进程,然后阻塞直到收到输出(但是直到进程完成,就像通信一样)?当然,我可以简单地延迟一段时间,但这显然是充其量的。

1 个答案:

答案 0 :(得分:0)

这里没有什么复杂的。要启动流程,然后阻止直到收到输出",您只需执行这两项操作即可。问题似乎在于您正在寻找一次性完成所有操作的包装函数(ala check_outputcommunicate方法);没有一个,但你想要的是微不足道的。

如果您了解communicate

,您可能已经知道如何启动该流程
p = subprocess.Popen(args, other=flags, stdout=subprocess.PIPE)

阻止直到收到输出:

_ = p.stdout.read()

就是这样。

稍后,要关闭服务器,如果你想要杀死它:

p.kill()
p.wait() # or p.communicate()

如果您的服务器在管道关闭时正常关闭,您可能需要查看communicate文档中的此示例:

try:
    outs, errs = proc.communicate(timeout=15)
except TimeoutExpired:
    proc.kill()
    outs, errs = proc.communicate()

或者如果它希望某个特定信号要求它正常关闭,你可能想尝试类似的kill,timeout-wait,hard-kill,wait。