我想将优秀的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()在这种情况下不起作用)
有什么想法吗?
提前致谢
答案 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
发送到父进程。 (推荐)答案 3 :(得分:0)
我无法在请求中关闭瓶子服务器,因为瓶子似乎在子流程中运行请求。
我最终找到了解决办法:
sys.stderr.close()
在请求中(已经传递给瓶子服务器并将其砍掉)。
也许在你的过程中尝试这样做,看看瓶子是否得到了消息。