2

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

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

瓶子应用程序非常简单

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

run(reloader=True)

它将默认网络服务器启动到 Windows 控制台。

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

任何的想法?

提前致谢

4

4 回答 4

4

有两种方法可以关闭重载服务器:

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

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

于 2010-04-15T14:47:27.653 回答
1

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

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

于 2010-04-15T10:02:21.927 回答
1

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

  • 点击Ctrl-C或发送SIGINT到父进程。(受到推崇的)
  • 杀死父进程。孩子会在 2 秒内优雅地死去。
  • 使用除 3 以外的任何状态码终止子进程或 sys.exit()。父进程将立即死亡。
于 2010-07-30T13:41:35.480 回答
0

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

我最终发现解决方案是:

sys.stderr.close()

在请求内部(被传递到瓶子服务器并取消它)。

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

于 2012-07-15T02:45:40.283 回答