Come fermare il server web bottiglia, quando lanciato da sottoprocesso
-
27-09-2019 - |
Domanda
vorrei incorporare il grande Bottiglia framework web in una piccola applicazione (prima destinazione è il sistema operativo Windows ). Questa applicazione si avvia la bottiglia web server grazie al modulo sottoprocesso.
import subprocess
p = subprocess.Popen('python websrv.py')
L'applicazione è molto semplice bottiglia
@route("/")
def index():
return template('index')
run(reloader=True)
Si inizia il server web predefinito in una console di Windows.
Tutto sembra ok, tranne il fatto che devo premere Ctrl-C per chiudere il server web bottiglia. Vorrei che l'applicazione maestro termina il server web quando si arresti. Non riesco a trovare un modo per farlo (p.terminate () non funziona in questo caso purtroppo)
Qualche idea?
Grazie in anticipo
Soluzione
Ci sono due modi per spegnere un server di ricarico:
1) È terminare p (usando os.kill(p.pid)
o p.terminate()
) e quindi modificare la data di modifica 'websrv.py' (os.utime('websrv.py')
) per far scattare un arresto automatico del processo figlio.
2) È terminare p con os.kill(p.pid, signal.SIGINT)
identico ad un arresto Ctrl-C
.
Altri suggerimenti
Sembra che il processo di terminazione non funziona se bottiglia è in modalità di ricarica. In questo caso, si inizia iteself un sottoprocesso.
Se ricarica è impostato su False, il terminare sembra funzionare bene.
A partire dalla 0.8.1 server di ricarico è abbastanza intelligente per ripulire i processi orfani. Ora avete diversi modi per terminare il server:
- Hit
Ctrl-C
o inviareSIGINT
al processo padre. (Consigliata) - Uccidere il processo padre. Il bambino morirà con grazia entro 2 secondi.
- uccidere il processo figlio o sys.exit () con qualsiasi codice di stato diverso da 3. Il genitore morirà immediatamente.
ho avuto problemi a chiusura di un server di bottiglia all'interno di una richiesta in bottiglia sembra correre richieste in sottoprocessi.
Alla fine ho trovato la soluzione era quella di fare:
sys.stderr.close()
all'interno della richiesta (che ha ottenuto passato al server bottiglia e cartesiano di esso).
Forse provare a farlo nel vostro processo e vedere se la bottiglia ottiene il messaggio.