Pregunta

Me gustaría incrustar el gran Bottle marco web en una pequeña aplicación (primera meta es el sistema operativo Windows ). Esta aplicación se inicia la botella servidor web gracias al módulo subproceso.

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

La aplicación es bastante simple botella

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

run(reloader=True)

Se inicia el servidor web por defecto en una consola de Windows.

Todo parece bien, excepto el hecho de que tengo que pulsar Ctrl-C para cerrar el servidor web botella. Me gustaría que la aplicación principal termina el servidor web cuando cierres. No puedo encontrar una manera de hacer eso (p.terminate () no funciona en este caso por desgracia)

¿Alguna idea?

Gracias de antemano

¿Fue útil?

Solución

Existen dos formas para apagar un servidor de recarga:

1) se pone fin a p (usando os.kill(p.pid) o p.terminate()) y luego cambiar la fecha de modificación de 'websrv.py' (os.utime('websrv.py')) para activar un apagado automático del proceso hijo.

2) Se termina con p os.kill(p.pid, signal.SIGINT) que es idéntica a una parada Ctrl-C.

Otros consejos

Parece que el proceso termine no funciona si la botella está en modo de recarga. En este caso, se inicia iteself un subproceso.

Si la recarga se establece en False, el terminar parece funcionar bien.

A partir de 0.8.1 el servidor de recarga es lo suficientemente inteligente como para limpiar los procesos huérfanos. Ahora tiene varias maneras de terminar el servidor:

  • Ctrl-C Hit or send SIGINT al proceso padre. (Recomendado)
  • Matar el proceso padre. El niño morirá agraciado dentro de 2 segundos.
  • Kill el proceso hijo o sys.exit () con cualquier código de estado distinto de 3. El padre morirá inmediatamente.

Yo tenía problemas para cerrar un servidor de botella dentro de una petición como la botella parece correr en las solicitudes de subprocesos.

Al final encontré la solución era hacer:

sys.stderr.close()

Dentro de la solicitud (que conseguir pasado hasta el servidor botella y se canceló).

Tal vez trate de hacer que en su proceso y ver si la botella reciba el mensaje.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top