python - para - start mongodb mac
Crear un servicio python win32 (2)
Nunca utilicé estas API, pero al explorar el código, parece que la clase que se pasó se usa para registrar el nombre de la clase en el registro, por lo que no puede hacer ninguna inicialización propia. Pero hay un método llamado GetServiceCustomOption que puede ayudar:
http://mail.python.org/pipermail/python-win32/2006-April/004518.html
Actualmente estoy tratando de crear un servicio win32 usando pywin32. Mi principal punto de referencia ha sido este tutorial:
http://code.activestate.com/recipes/551780/
Lo que no entiendo es el proceso de inicialización, ya que Daemon nunca se inicializa directamente por Daemon (), sino que, en mi opinión, se inicializa con lo siguiente:
mydaemon = Daemon
__svc_regClass__(mydaemon, "foo", "foo display", "foo description")
__svc_install__(mydaemon)
Donde svc_install , maneja la inicialización, llamando a Daemon. init () y pasandole algunos argumentos.
Pero, ¿cómo puedo inicializar el objeto daemon sin inicializar el servicio? Quiero hacer algunas cosas antes de iniciar el servicio. ¿Alguien tiene alguna idea?
class Daemon(win32serviceutil.ServiceFramework):
def __init__(self, args):
win32serviceutil.ServiceFramework.__init__(self, args)
self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
def SvcDoRun(self):
self.run()
def SvcStop(self):
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
win32event.SetEvent(self.hWaitStop)
def start(self):
pass
def stop(self):
self.SvcStop()
def run(self):
pass
def __svc_install__(cls):
win32api.SetConsoleCtrlHandler(lambda x: True, True)
try:
win32serviceutil.InstallService(
cls._svc_reg_class_,
cls._svc_name_,
cls._svc_display_name_,
startType = win32service.SERVICE_AUTO_START
)
print "Installed"
except Exception, err:
print str(err)
def __svc_regClass__(cls, name, display_name, description):
#Bind the values to the service name
cls._svc_name_ = name
cls._svc_display_name_ = display_name
cls._svc_description_ = description
try:
module_path = sys.modules[cls.__module__].__file__
except AttributeError:
from sys import executable
module_path = executable
module_file = os.path.splitext(os.path.abspath(module_path))[0]
cls._svc_reg_class_ = ''%s.%s'' % (module_file, cls.__name__)
Simplemente creo un "cómo hacerlo" simple donde el programa está en un módulo y el servicio está en otro lugar, usa py2exe para crear el servicio win32, que creo que es lo mejor que puedes hacer por tus usuarios que no quieren meterse con el intérprete de python u otras dependencias.
Puede consultar mi tutorial aquí: Crear servicios win32 utilizando Python y py2exe