从子进程启动时如何停止Bottle Web服务器

时间:2010-04-15 07:48:02

标签: python windows console-application subprocess bottle

我想将优秀的Bottle Web框架嵌入到一个小应用程序中(第一个目标是Windows操作系统)。由于子进程模块,这个应用程序启动了瓶子web服务器。

import subprocess
p = subprocess.Popen('python websrv.py')

瓶子应用非常简单

@route("/")
def index():
    return template('index')

run(reloader=True)

它将默认Web服务器启动到Windows控制台中。

除了我必须按Ctrl-C关闭瓶子网络服务器这一事实外,一切似乎都没问题。我希望主应用程序在关闭时终止Web服务器。我找不到办法做到这一点(不幸的是,p.terminate()在这种情况下不起作用)

有什么想法吗?

提前致谢

4 个答案:

答案 0 :(得分:4)

关闭重新加载服务器有两种方法:

1)终止p(使用os.kill(p.pid)p.terminate())然后更改'websrv.py'(os.utime('websrv.py'))的修改时间以触发子进程的自动关闭

2)您使用os.kill(p.pid, signal.SIGINT)终止p,这与Ctrl-C关闭相同。

答案 1 :(得分:1)

如果Bottle处于重新加载模式,似乎终止进程不起作用。在这种情况下,它开始迭代一个子进程。

如果reload设置为False,则终止似乎正常。

答案 2 :(得分:1)

从0.8.1开始,重装服务器足够智能,可以清理孤立进程。您现在有几种方法可以终止服务器:

  • 点击Ctrl-C或将SIGINT发送到父进程。 (推荐)
  • 杀死父进程。孩子会在2秒内优雅地死去。
  • 使用3以外的任何状态代码终止子进程或sys.exit()。父进程将立即死亡。

答案 3 :(得分:0)

我无法在请求中关闭瓶子服务器,因为瓶子似乎在子流程中运行请求。

我最终找到了解决办法:

sys.stderr.close()

在请求中(已经传递给瓶子服务器并将其砍掉)。

也许在你的过程中尝试这样做,看看瓶子是否得到了消息。