从子进程启动时如何停止 Bottle Web 服务器
-
27-09-2019 - |
题
我想嵌入伟大的 瓶子 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()
请求内部(即得到了向上传递到瓶子服务器和削减了它)。
也许尝试这样做,在你的进程,看看瓶子得到消息。
不隶属于 StackOverflow