Python 3 ejecutable como servicio de Windows
Estoy tratando de escribir un servicio de Windows en Python, pero la parte difícil es que quiero implementarlo en una máquina que no tiene Python. He creado con éxito un servicio comoesta, y funciona si ejecuto desde mi máquina. El problema comienza cuando intento convertirlo en un exe y luego trato de instalarlo. Primero intenté usar el ejemplo del servicio cx_freeze, (vistoaquí), el setup.py se ve así:
from cx_Freeze import setup, Executable
options = {'build_exe': {'includes': ['ServiceHandler']}}
executables = [Executable('Config.py', base='Win32Service', targetName='gsr.exe')]
setup(name='GSR',
version='0.1',
description='GSR SERVICE',
executables=executables,
options=options
)
y config.py es:
NAME = 'GSR_%s'
DISPLAY_NAME = 'GSR TEST - %s'
MODULE_NAME = 'ServiceHandler'
CLASS_NAME = 'Handler'
DESCRIPTION = 'Sample service description'
AUTO_START = True
SESSION_CHANGES = False
pero cuando intento compilarlo (python setup.py build) aparece un error: "cx_Freeze.freezer.ConfigError: ninguna base llamada Win32Service"
En segundo lugar, intenté usar una configuración regular de cx_freeze, el exe que obtengo instala bien el servicio, pero una vez que intento iniciarlo recibo un error: "Error 1053: El servicio no respondió a la solicitud de inicio o control de manera oportuna"
setup.py - python 3.3 regualr exe, instala el servicio pero al intentar iniciarlo envía un error:
from cx_Freeze import setup, Executable
packages = ['win32serviceutil','win32service','win32event','servicemanager','socket','win32timezone','cx_Logging','ServiceHandler']
build_exe_options = {"packages": packages}
executable = [Executable("ServiceHandler.py")]
setup( name = "GSR_test",
version = "1.0",
description = "GSR test service",
options = {"build_exe": build_exe_options},
executables = executable)
finalmente, logré que funcione en python 2.7 usando py2exe, pero py2exe no está disponible para python 3.3 y mi código está en 3.3
Supongo que el problema está en la configuración de setup.py que estoy usando con cx_freeze. algunas ideas ??
mi ServiceHandler:
import pythoncom
import win32serviceutil
import win32service
import win32event
import servicemanager
import socket
from test import test
import threading
class AppServerSvc (win32serviceutil.ServiceFramework):
_svc_name_ = "GSR_test"
_svc_display_name_ = "GSR test Service"
def __init__(self,args):
win32serviceutil.ServiceFramework.__init__(self,args)
self.hWaitStop = win32event.CreateEvent(None,0,0,None)
socket.setdefaulttimeout(60)
self.app = test()
self.flag = threading.Event()
def SvcStop(self):
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
win32event.SetEvent(self.hWaitStop)
self.flag.set()
def SvcDoRun(self):
servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
servicemanager.PYS_SERVICE_STARTED,
(self._svc_name_,''))
self.main()
def main(self):
t = threading.Thread(target=self.app.run)
t.start()
self.flag.wait()
raise SystemExit
if __name__ == '__main__':
win32serviceutil.HandleCommandLine(AppServerSvc)
Setup.py, python 2.7 usando py2exe que funciona: (tomado deaquí)
from distutils.core import setup
import py2exe
setup( service = ["ServiceHandler"],
description = "SERVICE TEST",
modules = ["GSR_test"],
cmdline_style='pywin32', )
Gracias Amit