Python Language
Creare un servizio Windows usando Python
Ricerca…
introduzione
I processi senza testa (senza interfaccia utente) in Windows sono denominati Servizi. Possono essere controllati (avviati, fermati, ecc.) Utilizzando i controlli standard di Windows come la console di comando, Powershell o la scheda Servizi in Task Manager. Un buon esempio potrebbe essere un'applicazione che fornisce servizi di rete, come un'applicazione web o forse un'applicazione di backup che esegue varie attività di archiviazione in background. Esistono diversi modi per creare e installare un'applicazione Python come servizio in Windows.
Uno script Python che può essere eseguito come servizio
I moduli utilizzati in questo esempio fanno parte di pywin32 (estensioni Python per Windows). A seconda di come hai installato Python, potrebbe essere necessario installarlo separatamente.
import win32serviceutil
import win32service
import win32event
import servicemanager
import socket
class AppServerSvc (win32serviceutil.ServiceFramework):
_svc_name_ = "TestService"
_svc_display_name_ = "Test Service"
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):
pass
if __name__ == '__main__':
win32serviceutil.HandleCommandLine(AppServerSvc)
Questo è solo il boilerplate. Il tuo codice applicazione, probabilmente invocando uno script separato, andrebbe nella funzione main ().
Sarà inoltre necessario installarlo come servizio. La migliore soluzione al momento sembra essere quella di utilizzare il gestore di servizi non sucking . Ciò consente di installare un servizio e fornisce una GUI per configurare la riga di comando che il servizio esegue. Per Python puoi fare questo, che crea il servizio in un colpo solo:
nssm install MyServiceName c:\python27\python.exe c:\temp\myscript.py
Dove my_script.py è lo script boilerplate sopra, modificato per richiamare lo script o il codice dell'applicazione nella funzione main (). Si noti che il servizio non esegue direttamente lo script Python, esegue l'interprete Python e lo passa lo script principale sulla riga di comando.
In alternativa è possibile utilizzare gli strumenti forniti nel Resource Kit di Windows Server per la versione del sistema operativo in uso, quindi creare il servizio.
Esecuzione di un'applicazione Web Flask come servizio
Questa è una variante dell'esempio generico. Devi solo importare lo script dell'app e invocare il suo metodo run()
nella funzione main()
del servizio. In questo caso stiamo anche utilizzando il modulo multiprocessing a causa di un problema durante l'accesso a WSGIRequestHandler
.
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)
Adattato da http://stackoverflow.com/a/25130524/318488