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

È stato utile?

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 inviare SIGINT 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top