2014-05-08 12 views
7

olarak burada bulduğu şablonu kullanıyorum dağıtma Flask uygulaması:windows hizmeti

Is it possible to run a Python script as a service in Windows? If possible, how? İşte ben yukarıdaki bağlantıyı yönergeleri izleyerek bir hizmet olarak yükledim benim run.py, bu.

"yerel Bilgisayar'da Şişesi App hizmeti başladı ve durdu Bazı servisler tarafından kullanılmakta değilse otomatik olarak durur: Ben hizmetini başlatmaya çalıştığınızda

from app import app 

import win32serviceutil 
import win32service 
import win32event 
import servicemanager 
import socket 


class AppServerSvc (win32serviceutil.ServiceFramework): 
    _svc_name_ = "Flask App" 
    _svc_display_name_ = "Flask 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) 

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

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

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

Ancak, ben mesajı alıyorum. diğer hizmetler veya programlar. "

Neyi yanlış yaptığımı biliyor musunuz? Çeşitli kullanıcı hesaplarını denedim - bunun bir izin problemi olduğunu düşünmüyorum.

Teşekkürler!

cevap

5

request dışındaki Flask'ta WSGIRequestHandler'a erişemiyorum, bu yüzden Process kullanın.

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

from app import app 


class Service(win32serviceutil.ServiceFramework): 
    _svc_name_ = "TestService" 
    _svc_display_name_ = "Test Service" 
    _svc_description_ = "Tests Python service framework by receiving and echoing messages over a named pipe" 

    def __init__(self, *args): 
     super().__init__(*args) 

    def SvcStop(self): 
     self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) 
     self.process.terminate() 
     self.ReportServiceStatus(win32service.SERVICE_STOPPED) 

    def SvcDoRun(self): 
     self.process = Process(target=self.main) 
     self.process.start() 
     self.process.run() 

    def main(self): 
     app.run() 


if __name__ == '__main__': 
    win32serviceutil.HandleCommandLine(Service) 
+0

Kod örneği için teşekkürler! Windows sunucusunda başarıyla _deploy_ için kullandım. Ancak ** İç sunucu hatası ** oluyordu ve sadece os.chdir (os.path.dirname (os.path.realpath (__ file__))) 'ile - çözmek mümkün oldu, sorun şu oldu, senaryo bazı 'win32' klasöründen (hizmet olarak) çalıştırıldı, bu nedenle herhangi bir dosya yüklenerek (betiğin' dir'inde olması bekleniyor) bir hata oluştu. – quapka

2

Figured it - app.run() 'da hata ayıklama seçeneğini açık bıraktım. Bunu kaldırdıktan sonra, gitmek güzel!

Hizmet düzgün çalışmaya başlar ve düzgün çalışır (flask uygulamasına ağdaki başka bir bilgisayardan erişebilirim), duramıyor. Kullandığım yayınlanmış şablonla iş parçacığında, yazar hizmeti düzgün şekilde durdurmak için bir bayrağın ayarlanmasından söz eder.

Bunun ne anlama geldiğini ve hizmeti düzgün şekilde durdurmak için nasıl kodlanacağını bilen var mı?

-3

Kodumu SvcStop() son satırına ekledim. "self.ReportServiceStatus (win32service.SERVICE_STOPPED)"

Benim durumumda, Servis durdurma için çalışıyor.

from app import app 

import win32serviceutil 
import win32service 
import win32event 
import servicemanager 
import socket 


class AppServerSvc (win32serviceutil.ServiceFramework): 
    _svc_name_ = "Flask App" 
    _svc_display_name_ = "Flask 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) 
     # !important! to report "SERVICE_STOPPED" 
     self.ReportServiceStatus(win32service.SERVICE_STOPPED) 

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

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

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