Buscar..


Introducción

Los procesos sin cabeza (sin interfaz de usuario) en Windows se denominan Servicios. Se pueden controlar (iniciar, detener, etc.) mediante los controles estándar de Windows, como la consola de comandos, Powershell o la pestaña Servicios en el Administrador de tareas. Un buen ejemplo podría ser una aplicación que proporcione servicios de red, como una aplicación web, o tal vez una aplicación de respaldo que realice varias tareas de archivado en segundo plano. Hay varias formas de crear e instalar una aplicación de Python como un Servicio en Windows.

Un script de Python que se puede ejecutar como un servicio

Los módulos utilizados en este ejemplo son parte de pywin32 (Python para extensiones de Windows). Dependiendo de cómo instaló Python, es posible que necesite instalar esto por separado.

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)

Esto es sólo boilerplate. Su código de aplicación, probablemente invocando un script separado, iría en la función main ().

También necesitarás instalar esto como un servicio. La mejor solución para esto en este momento parece ser utilizar el Administrador de servicios que no chupa . Esto le permite instalar un servicio y proporciona una GUI para configurar la línea de comandos que ejecuta el servicio. Para Python puedes hacer esto, lo que crea el servicio de una sola vez:

nssm install MyServiceName c:\python27\python.exe c:\temp\myscript.py

Donde my_script.py es el script de boilerplate anterior, modificado para invocar su script o código de aplicación en la función main (). Tenga en cuenta que el servicio no ejecuta la secuencia de comandos de Python directamente, ejecuta el intérprete de Python y le pasa la secuencia de comandos principal en la línea de comandos.

Alternativamente, puede usar las herramientas proporcionadas en el Kit de recursos de Windows Server para la versión de su sistema operativo, así que cree el servicio.

Ejecutando una aplicación web de Flask como un servicio

Esta es una variación del ejemplo genérico. Solo necesita importar el script de su aplicación e invocar el método run() en la función main() . En este caso, también estamos usando el módulo de multiprocesamiento debido a un problema al acceder 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)

Adaptado de http://stackoverflow.com/a/25130524/318488



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow