2012-01-20 16 views
16

Sto cercando di avviare un semplice esempio di servizio:Impossibile avviare il servizio Windows scritto in 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) 

Quando eseguo

python someservice.py install 

tutto è a posto e il servizio appare nell'elenco dei servizi di Windows, ma

python someservice.py start 

non riesce con "Errore 1053: il servizio non ha risposto alla richiesta di avvio o controllo in modo tempestivo", ma non c'è alcun ritardo.

Ho cercato su Google una soluzione, che ha detto che succede quando pythonservice.exe non è in grado di individuare python27.dll. In realtà non è stato così ho aggiunto C:\Python27 a PATH. Ora pythonservice.exe funziona correttamente, ma l'errore 1053 è ancora presente.

Sto eseguendo Python 2.7.2 con pywin32 216 su Windows 7 Ultimate con privilegi di amministratore.

+0

Questo ha funzionato per me, eseguendo Python 2.6.6 (64 bit) e pywin32 216 amd64-py26. Capisco che non è molto utile però. Su Windows 7 Pro. – jgritty

+3

+1 per aver menzionato che l'errore 1053 si verifica se 'pythonservice.exe' non riesce a localizzare' python27.dll'. Mi ci sono voluto per sempre per capirlo! Grazie :) – Gili

risposta

3

Credo che il vostro problema sarà risolto se si cambia metodo SvcDoRun

da

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

Inoltre, grazie per aver ricordato che potrebbe essere un problema DLL , che mi ha portato a trovare la soluzione giusta.

È necessario aggiungere Python27 a SYSTEM PATH e non a USER PATH, poiché come impostazione predefinita il servizio python verrà installato come "LocalSystem" e quindi quando tenta di avviarlo utilizza il SYSTEM Variabile PATH: ecco perché è possibile eseguirlo dal prompt dei comandi, il PERCORSO UTENTE è corretto.

Spero che aiuti!

+5

Potrebbe essere utile in questo caso anche aggiungere queste directory al tuo percorso di sistema: 'C: \ Python27 \ Lib \ site-packages \ win32' e' C: \ Python27 \ Lib \ site-packages \ pywin32_system32' . Questo ti permetterà di usare pythonservice più facilmente. – BuvinJ

+0

@BuvinJ Ciò ha corretto il mio errore 1053 durante l'utilizzo di PythonService.exe. grazie! – Kenneth

+0

@mpaf Puoi aiutare a descrivere come aggiungere elementi al percorso di sistema? Ah capisco, è sufficiente aggiungerlo al percorso complessivo del sistema del computer nel 'Pannello di controllo del sistema'.Personalmente ho dovuto aggiungere anaconda come in https://www.snip2code.com/Snippet/770602/setup-python-script-as-windows-service –

1

Un altro consiglio utile è quello di aggiungere la seguente riga

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

prima di chiamare

win32serviceutil.HandleCommandLine(...)

In questo modo è possibile ottenere informazioni più utili dal servizio di ciò che va male.

Problemi correlati