Question

Je voudrais intégrer le grand Bouteille framework web dans une petite application (1ère cible est Windows OS ). Cette application commence la bouteille grâce au serveur Web du module sous-processus.

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

L'application de la bouteille est assez simple

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

run(reloader=True)

Il commence le serveur Web par défaut dans une console Windows.

Tout semble Ok, sauf le fait que je dois appuyer sur Ctrl-C pour fermer le serveur Web de la bouteille. Je voudrais que l'application maître termine le serveur Web quand il Shutdowns. Je ne peux pas trouver un moyen de le faire (p.terminate () ne fonctionne pas dans ce cas malheureusement)

Toute idée?

Merci à l'avance

Était-ce utile?

La solution

Il y a deux façons d'arrêter un serveur rechargeant:

1) Vous résiliez p (en utilisant os.kill(p.pid) ou p.terminate()), puis changer la date de modification de 'websrv.py' (os.utime('websrv.py')) pour déclencher un arrêt automatique du processus enfant.

2) Vous résiliez p avec os.kill(p.pid, signal.SIGINT) qui est identique à un arrêt de Ctrl-C.

Autres conseils

Il semble que le processus fin ne fonctionne pas si la bouteille est en mode de recharge. Dans ce cas, il commence iteself un sous-processus.

Si reload est définie sur False, la fin semble fonctionner Ok.

A partir de 0.8.1 le serveur de rechargement est assez intelligent pour nettoyer les processus orphelins. Vous avez maintenant plusieurs façons de mettre fin au serveur:

  • Hit Ctrl-C ou envoyer SIGINT au processus parent. (Recommandé)
  • Tuer le processus parent. L'enfant va mourir gracieusement à moins de 2 secondes.
  • Tuer le processus d'enfant ou sys.exit () avec un code d'état autre que 3. Le parent va mourir immédiatement.

J'ai eu du mal à fermer un serveur de bouteille à partir d'une demande en bouteille semble fonctionner dans les requêtes des sous-processus.

J'ai finalement trouvé était de faire la solution:

sys.stderr.close()

dans la demande (qui a obtenu passé sur le serveur de la bouteille et il hache).

Peut-être essayer de faire que dans votre processus et voir si la bouteille reçoit le message.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top