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

Python:作为守护进程启动子进程并等待启动,python,subprocess,Python,Subprocess,我有一些依赖外部服务器运行的python代码。启动时,服务器向STDOUT输出一个字符串,指示它已准备好接收请求。我希望从python代码中启动服务器,等待输出字符串,运行python代码的其余部分,然后关闭服务器。然而,到目前为止,我所能想到的方法是a)启动服务器并立即继续(创建通常失败的竞争条件),或者b)启动服务器并等待它完成(因为它是一个服务器,所以永远不会发生这种情况) 有没有办法启动流程,然后阻塞直到收到输出(但不是像Communication那样直到流程完成)?当然,我可以简单地加

我有一些依赖外部服务器运行的python代码。启动时,服务器向STDOUT输出一个字符串,指示它已准备好接收请求。我希望从python代码中启动服务器,等待输出字符串,运行python代码的其余部分,然后关闭服务器。然而,到目前为止,我所能想到的方法是a)启动服务器并立即继续(创建通常失败的竞争条件),或者b)启动服务器并等待它完成(因为它是一个服务器,所以永远不会发生这种情况)


有没有办法启动流程,然后阻塞直到收到输出(但不是像Communication那样直到流程完成)?当然,我可以简单地加上一个时间延迟,但这充其量显然是一个笨拙的问题。

这里没有什么复杂的东西。要“启动进程,然后阻塞直到收到输出”,您只需执行这两项操作。问题似乎是您正在寻找一个包装器函数(ala
check\u output
communicate
方法),它可以一次性完成所有工作;没有,但你想要的是微不足道的

如果您了解
通信
,您可能已经知道如何启动流程:

p = subprocess.Popen(args, other=flags, stdout=subprocess.PIPE)
并阻止,直到收到输出:

_ = p.stdout.read()
就这样


稍后,要关闭服务器,如果要硬终止它,请执行以下操作:

p.kill()
p.wait() # or p.communicate()
如果您的服务器在其管道关闭时正常关闭,您可能希望查看以下文档中的示例:


或者,如果它需要一个特定的信号要求它正常关机,您可能需要尝试类似的终止、超时等待、硬终止、等待。

将服务器的标准输出连接到管道并读取。@cdarke Ah,.readline()似乎在这里起作用。谢谢你的指点!但不是那么简单。在文档中:“如果size参数为负数或省略,则读取所有数据直到EOF”,因此a)我尝试找出正确的大小,或b)它阻塞直到EOF,而EOF永远不会出现(EOL yes.EOF,no)。是的,停止这个过程很容易,但你会注意到这不是我要问的:-)啊,进一步看,如果我把read()改为readline(),这应该行得通。变化虽小,但意义重大。据我所见,popen文档中没有提到。谢谢@ibrewster:没有提到它,因为我们只得到一个文件对象,它具有其他文件对象的属性(除了它不可查找)。不要将
Popen
(来自
子流程
)与
Popen
(来自
os
)混淆。令人困惑的是,os.popen()被视为不推荐使用。
try:
    outs, errs = proc.communicate(timeout=15)
except TimeoutExpired:
    proc.kill()
    outs, errs = proc.communicate()