Comment puis-je résilier un flacon application qui s'exécute en tant que service?

J'ai pu acquérir mon flacon d'application qui s'exécute comme un service grâce à Est-il possible d'exécuter un script Python en tant que service sous Windows? Si possible, comment?, mais quand il s'agit de l'arrêt, je ne peux pas. J'ai terminer le processus dans le gestionnaire des tâches.

Voici mon run.py ce qui me tourner vers un service via run.py installer:

from app import app

from multiprocessing import Process
import win32serviceutil
import win32service
import win32event
import servicemanager
import socket


class AppServerSvc (win32serviceutil.ServiceFramework):
    _svc_name_ = "CCApp"
    _svc_display_name_ = "CC App"

    def __init__(self,args):
        win32serviceutil.ServiceFramework.__init__(self,args)
        self.hWaitStop = win32event.CreateEvent(None,0,0,None)
        socket.setdefaulttimeout(60)

    def SvcStop(self):
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        win32event.SetEvent(self.hWaitStop)
        server.terminate()
        server.join()

    def SvcDoRun(self):
        servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
                              servicemanager.PYS_SERVICE_STARTED,
                              (self._svc_name_,''))
        self.main()

    def main(self):
        server = Process(app.run(host = '192.168.1.6'))
        server.start()

if __name__ == '__main__':
    win32serviceutil.HandleCommandLine(AppServerSvc)

J'ai eu le processus de trucs de ce post: http://librelist.com/browser/flask/2011/1/10/start-stop-flask/#a235e60dcaebaa1e134271e029f801fe mais malheureusement il ne fonctionne pas non plus.

Le fichier journal de l'Observateur d'Événements, dit que la variable globale "serveur" n'est pas défini. Cependant, j'ai fait serveur une variable globale et il me donne toujours la même erreur.

Bien, une couple de choses de mal avec cela. 1. server n'est pas défini dans SvcStop, c'est pourquoi vous obtenez ce message d'erreur. 2. server = Process(app.run(host = '192.168.1.6')) ne fait pas ce que vous pensez que cela fonctionne. Pourquoi pensez-vous que vous avez besoin pour exécuter l'application dans un processus distinct de toute façon?
Comment avez-vous mis le serveur en tant que variable globale? Les variables locales de l'ombre mondiales en Python automatiquement, de sorte que vous devrez peut-être utiliser le global de l'instruction pour l'affecter à des variables globales dans une portée locale.
J'ai seulement ajouté que le serveur et le processus de code parce que je cherchais un moyen de résilier le serveur dans SvcStop. Il est d'application.run() pour flacon, mais il n'est pas d'application.stop() ou son équivalent.
J'ai essayé ce, en faisant: global server server = Process(app.run(host= '192.168.1.6'))
Flacon à l'écoute de SIGINT pour voir si elle doit quitter. Vous pourriez peut-être envoyer un signal à vous-même dans SvcStop? Alternativement, si vous avez vraiment vraiment envie de courir à l'application dans un processus distinct, assurez-vous de définir le target mot-clé arg à app.run au lieu de l'appeler app.run directement.

OriginalL'auteur Chockomonkey | 2014-05-09