manager - No se puede iniciar el servicio de Windows escrito en Python(win32serviceutil)
windows service creator (5)
Además, gracias por señalar que podría ser un problema de DLL, eso me llevó a encontrar la solución correcta.
Lo que hay que hacer es agregar Python27 a SYSTEM PATH, y no a USER PATH, ya que, de manera predeterminada, el servicio de python se instalará como ''LocalSystem'', por lo que cuando intenta iniciarlo, utiliza la variable SYSTEM PATH. Por qué puede ejecutarlo desde el símbolo del sistema, su ruta de usuario es correcta.
¡Espero eso ayude!
Estoy tratando de comenzar un ejemplo de servicio simple:
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 decía que sucede cuando pythonservice.exe
no puede localizar python27.dll
. Realmente no se pudo, así que agregué C:/Python27
a PATH
. Ahora pythonservice.exe
ejecuta bien, pero el error 1053 sigue ahí.
Estoy ejecutando Python 2.7.2 con pywin32 216 en Windows 7 Ultimate con privilegios de administrador.
Creo que su problema se solucionará si cambia el método SvcDoRun
desde
def SvcDoRun(self):
win32event.WaitForSingleObject(self.hWaitStop, win32event.INFINITE)
a
def SvcDoRun(self):
self.ReportServiceStatus(win32service.SERVICE_RUNNING)
win32event.WaitForSingleObject(self.hWaitStop, win32event.INFINITE)
Otro consejo útil es agregar la siguiente línea.
sys.frozen = ''windows_exe'' # Fake py2exe so we can debug
antes de llamar
win32serviceutil.HandleCommandLine(...)
De esa manera, puede obtener más información útil del servicio de lo que sale mal.
Puedo ejecutar el servicio siguiendo estos procedure usando Python 3.5 y PyInstaller
También tuve este problema y pude resolverlo agregando lo siguiente a mi bloque de ejecución "__main__"
:
if len(sys.argv) == 1:
servicemanager.Initialize()
servicemanager.PrepareToHostSingle(RouterService)
servicemanager.StartServiceCtrlDispatcher()
else:
win32serviceutil.HandleCommandLine(RouterService)
(No olvide importar el administrador de servicios en la parte superior del archivo).
Creo que el problema es que el administrador de servicios de Windows ejecuta el ejecutable sin argumentos (de manera predeterminada) y cuando este es el caso, la aplicación necesita que se le SvcDoRun
correctamente que inicie el servicio, no parece que se llame a SvcDoRun
automáticamente.
Como han mencionado otros, necesita una asignación de ruta si la ejecuta desde la línea de comandos. En mi aplicación, congelé el servicio con cx_freeze
y utilicé el ejecutable para instalar el servicio para que se incluyeran todas las dependencias.