我有一些python代码依赖于外部服务器运行。在启动时,服务器向STDOUT输出一个字符串,表明它已准备好接收请求。我希望做的是,从我的python代码,启动服务器,等待输出字符串,运行我的其余python代码,然后关闭服务器。然而,到目前为止,我能够弄清楚如何做到a)启动服务器并立即继续(创建通常失败的竞争条件),或b)启动服务器并等待它完成(从不发生,因为它是一个服务器)
有没有办法启动进程,然后阻塞直到收到输出(但是直到进程完成,就像通信一样)?当然,我可以简单地延迟一段时间,但这显然是充其量的。
答案 0 :(得分:0)
这里没有什么复杂的。要启动流程,然后阻止直到收到输出",您只需执行这两项操作即可。问题似乎在于您正在寻找一次性完成所有操作的包装函数(ala check_output
或communicate
方法);没有一个,但你想要的是微不足道的。
如果您了解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。