views:

167

answers:

3

Hello all,

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

A: 

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.

luc
+2  A: 

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.

Does 2) work on Windows? Thanks for the answer. I will try that.
luc
If signal.SIGINT is defined, this should work on windows, too. I haven't tested it, though.
A: 

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.
Marcel