Question

I would like to embed the great Bottle web framework into a small application (1st target is Windows OS). This app starts the bottle webserver thanks to the subprocess module.

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

The bottle app is quite simple

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

run(reloader=True)

It starts the default webserver into a Windows console.

All seems Ok except the fact that I must press Ctrl-C to close the bottle webserver. I would like that the master app terminates the webserver when it shutdowns. I can't find a way to do that (p.terminate() doesn't work in this case unfortunately)

Any idea?

Thanks in advance

Was it helpful?

Solution

There are two ways to shutdown a reloading server:

1) You terminate p (using os.kill(p.pid) or p.terminate() ) and then change the modification time of 'websrv.py' (os.utime('websrv.py')) to trigger an automatic shutdown of the child process.

2) You terminate p with os.kill(p.pid, signal.SIGINT) which is identical to a Ctrl-C shutdown.

OTHER TIPS

It seems that the terminate process doesn't work if Bottle is in reload mode. In this case, it starts iteself a subprocess.

If reload is set to False, the terminate seems to work Ok.

Starting with 0.8.1 the reloading server is smart enough to clean up orphan processes. You now have several ways to terminate the server:

  • Hit Ctrl-C or send SIGINT to the parent process. (recommended)
  • Kill the parent process. The child will die gracefully within 2 seconds.
  • Kill the child process or sys.exit() with any status code other than 3. The parent will die immediately.

I had trouble closing a bottle server from within a request as bottle seems to run requests in subprocesses.

I eventually found the solution was to do:

sys.stderr.close()

inside the request (that got passed up to the bottle server and axed it).

Maybe try doing that in your process and see if bottle gets the message.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top