我想嵌入伟大的 瓶子 Web 框架转化为小型应用程序(第一个目标是 Windows 操作系统)。这个应用程序通过子进程模块启动了 Bottle Web 服务器。

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

瓶子应用程序非常简单

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

run(reloader=True)

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

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

任何想法?

提前致谢

有帮助吗?

解决方案

有两种方法来关闭一个重装服务器:

1)你终止P(使用os.kill(p.pid)p.terminate()),然后改变的“websrv.py”的修改时间(os.utime('websrv.py'))来触发子进程的自动关机功能。

2)你终止p与os.kill(p.pid, signal.SIGINT)其等同于一个Ctrl-C关机。

其他提示

看来,终止进程,如果瓶子在重装模式不起作用。在这种情况下,它开始iteself的子进程。

如果重新加载设置为False,则终止似乎工作好了。

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

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

我有麻烦从关闭请求内的瓶服务器作为瓶似乎运行在子过程的请求。

我最终发现该溶液做:

sys.stderr.close()

请求内部(即得到了向上传递到瓶子服务器和削减了它)。

也许尝试这样做,在你的进程,看看瓶子得到消息。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top