[Python-es] Ayuda con py2exe y pywin32 para compilar servicios
Boris Perez Canedo
inf200523 en ucf.edu.cu
Mie Mar 31 17:41:52 CEST 2010
Hola a todos,
Estoy tratando de convertir mi aplicación en un servicio
de windows uando: win32serviceutil.ServiceFramework y luego utilizo py2exe para
compilar.
Sigo el ejemplo publicado en: http://islascruz.org/html/index.php?gadget=StaticPage&action=Page&id=6
La cuestion es que compila y cuando hago "myservice.exe -install" todo
parece ir bien, chequeo si el servicio aparece en la lista, y está, pero cuando
intento correrlo me sale un mensaje que dice qlgo asi como que el servicio se
inició y luego se detuvo.
Tengo entendido que el sevicio debe estar
corriendo constantemente, incluso sin hacer nada.
Si lo corro en IDE de python
puedo ver que se mantiene corriendo y funciona correctamente, no entiendo por qué
no ocurre lo mismo cuando es compilado, instalado e iniciado.
Este es el
código que intento hacer funcionar:
# fichero RunningAsService.py
import win32serviceutil
import win32service
import win32event
import
os
import sys
import time
from ThreadedXMLRPCServer import
ThreadedXMLRPCServer_BasicAuth, SecureXMLRPCServer, ServerFunction
from
processServerConfig import ReadServerFile
from ProcessAuth import ReadAuthFile
import RunSystem #aqui hay una clase que es la que corre a secure y a server en
diferentes hilos.(tomada del tutorial)
#secure es una instancia de
SecureXMLRPCServer
#server lo es de ThreadedXMLRPCServer_BasicAuth
# la
configuracion para secure y server la leo de un fichero xml que contiene entre otras
cosas los
#puertos, una lista de ip autorizados, una lista de usuarios
autorizados,..., y el path para los ficheros cert.pem
# y key.pem usados por secure
para ssl
def main():
sys.path.insert(0,os.getcwd())# viene en el ejemplo del link, creo es para
poder detener el servicio
import RunSystem
secure = ...#creo
mi instancia
server =
...#creo mi instancia
service =
RunSystem.RunServers(secure,None,server)# corren en hilos separados
class
XmlRPCService(win32serviceutil.ServiceFramework):
_svc_name_ =
'ServiceTest'
_scv_display_name_ ='Servicio XML-RPC de
prueba'
def __init__(self, args):
win32serviceutil.ServiceFramework.__init__(self, args)
self.hWaitStop =
win32event.CreateEvent(None, 0, 0, None)
def SvcStop(self):
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
sys.stopservice = "true"#
según el tutorial es necesario para poder detener el servicio, ya que no hay
foma
# de accederlo desde aquí
win32event.SetEvent(self.hWaitStop)
def SvcDoRun(self):
main()
Nota: para correrlo en el IDE de python no utilizo esta clase,
simplemente invoco al main(), que es lo que haria el método SvcDoRun() cuando ya
este compilado el servicio.
####################del módulo
RunSystem.py, para correr los servidores endiferentes hilos
class RunServers:
def __init__(self, server1, report_server,server2 = None):
self.server1 = server1
self.server2 = server2
self.report_server = report_server
thread.start_new(self.run1, tuple())
thread.start_new(self.run2, tuple())
thread.start_new(self.run_report_server,
tuple())
while True:# se mantiene
corriendo hasta que sea detenido usando herramientas administrativas servicios
if
getattr(sys,'stopservice', False):# para detener el servicio(ver def
SvcStop(self) )
sys.exit()
time.sleep(0.3)# no entiendo esto para que es
def run1(self):
if self.server1:
self.server1.serve_forever()
def run2(self):
if self.server1:
self.server2.serve_forever()
def run_report_server(self):
if self.report_server:
self.report_server.serve_forever()
def
run_date_checker(self):
print
"Hello"#estoy lo voy a utilizar luego para correr otro hilo(por ahora no se
utiliza)
#####
###### El setup.py que utilizo para compilar el servicio es el
siguiente
setup(name = 'XMLRPCService', version = '1.0.0.0',service =
['RunningAsService'],include = ['win32serviceutil','win32service',
'win32event','ThreadedXMLRPCServer',
'processServerConfig','ProcessAuth',
'RunSystem','os','re','time','sys','base64',
'SocketServer','ssl','xmlrpclib','pythoncom','SimpleXMLRPCServer','thread'] )
Tengo mis dudas sobre los parámetros de setup. Tengo entendido que
service debe contener los módulos que implementan clases de
servicio(win32serviceutil.ServiceFramework), pero no se si tengo que ponerlas
también en el include, tampoco me queda claro si por ejemplo, al incluir un
módulo que importa, por ejemplo, a SimpleXMLRPCServer no es necesario ya
poner SimpleXMLRPCServer en la lista include o si todo lo que importe de una forma u
otra tiene que aparecer explícitamente en esta lista.
Disculpen haber
escrito tanto.
Gracias de antemano.
Boris.
---
La mejor vacuna contra el virus A(H1N1) es la higiene personal
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20100331/df69266a/attachment.html>
Más información sobre la lista de distribución Python-es