2012-01-20 34 views
16

Estoy tratando de iniciar un ejemplo sencillo servicio:No se puede iniciar el servicio de Windows escrito en Python (win32serviceutil)

someservice.py:

import win32serviceutil 
import win32service 
import win32event 

class SmallestPythonService(win32serviceutil.ServiceFramework): 
    _svc_name_ = "SmallestPythonService" 
    _svc_display_name_ = "display service" 

    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) 
     win32event.SetEvent(self.hWaitStop) 

    def SvcDoRun(self): 
     win32event.WaitForSingleObject(self.hWaitStop, win32event.INFINITE) 

if __name__=='__main__': 
    win32serviceutil.HandleCommandLine(SmallestPythonService) 

Cuando corro

python someservice.py install 

todo está bien y el servicio aparece en la lista de servicios de Windows, pero

python someservice.py start 

falla con "Error 1053: el servicio no respondió a la solicitud de inicio o control de manera oportuna", pero no hay ningún retraso.

Busqué en Google una solución, que dice que sucede cuando pythonservice.exe no puede encontrar python27.dll. En realidad no pudo, así que agregué C:\Python27 a PATH. Ahora pythonservice.exe funciona bien, pero el error 1053 sigue ahí.

Estoy ejecutando Python 2.7.2 con pywin32 216 en Windows 7 Ultimate con privilegios de administrador.

+0

Esto funcionó para mí, ejecutando Python 2.6.6 (64 bit) y pywin32 216 amd64-py26. Me doy cuenta de que eso no es muy útil. En Windows 7 Pro. – jgritty

+3

+1 por mencionar que ocurre el error 1053 si 'pythonservice.exe' no puede localizar' python27.dll'. Me tomó para siempre para resolver esto! Gracias :) – Gili

Respuesta

3

Creo que su problema se solucionará por si cambia el método SvcDoRun

de

def SvcDoRun(self): 
     win32event.WaitForSingleObject(self.hWaitStop, win32event.INFINITE) 

a

def SvcDoRun(self): 
     self.ReportServiceStatus(win32service.SERVICE_RUNNING) 
     win32event.WaitForSingleObject(self.hWaitStop, win32event.INFINITE) 
9

También, gracias por señalar que podría ser un problema DLL , eso me llevó a encontrar la solución correcta.

Lo que necesita hacer es agregar el Python27 a la RUTA DEL SISTEMA, y no a la RUTA DEL USUARIO, ya que de manera predeterminada el servicio Python se instalará como un 'Sistema Local' y cuando intente iniciarlo utilizará el SISTEMA Variable PATH: por eso puede ejecutarla desde el símbolo del sistema, su RUTA DEL USUARIO es correcta.

Espero que ayude!

+5

Puede ser útil en este caso también agregar estos directorios a la ruta del sistema: 'C: \ Python27 \ Lib \ site-packages \ win32' y' C: \ Python27 \ Lib \ site-packages \ pywin32_system32' . Eso te permitirá usar pythonservice más fácilmente. – BuvinJ

+0

@BuvinJ Esto corrigió mi error 1053 al usar PythonService.exe. ¡gracias! – Kenneth

+0

@mpaf ¿Puede ayudarnos a describir cómo agregar cosas a la ruta del sistema? Ah, ya veo, simplemente agrégalo a la ruta general del sistema de la computadora en el 'Panel de control del sistema'.Personalmente, tuve que agregar anaconda como en https://www.snip2code.com/Snippet/770602/setup-python-script-as-windows-service –

1

Otro consejo útil es añadir la siguiente línea

sys.frozen = 'windows_exe' # Fake py2exe so we can debug

antes de llamar

win32serviceutil.HandleCommandLine(...)

De esta manera se puede obtener información más útil desde el servicio de lo que va mal.

Cuestiones relacionadas