python - Windows Service kode giver gevindfejl, når du bruger Pywin32/PyInstaller

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg får fejl ved brug af en python exe genereret fra pyinstaller for at oprette en windows service. Fejlmeddelelsen kan være uskadelig og synes ikke at påvirke driften af ​​tjenesten, men jeg er ikke sikker på, om der er Andre problemer foregår bag kulisserne. Jeg bruger pywin32-biblioteker til at installere applikationen som en windows-tjeneste. Jeg skal bemærke, at jeg ikke får denne fejl, når du installerer fra python scriptet selv, ved hjælp af PythonService.exe fra pywin32, kun fra den eksekverbare genereret med pyinstaller.


Når du bruger pyinstaller, kan jeg generere exe fra min Windows service kode og installere det, ikke noget problem. Jeg kan også starte tjenesten, intet problem. Jeg kan endda stoppe tjenesten, og programmet ser ud til at lukke ordentligt. Når jeg har startet stopet, får jeg dog følgende fejl på konsollen, mens jeg kører win32traceutil.py:


"Exception KeyError: KeyError(2244,) in <module 'threading' from '2uildpyi.win32agentserviceoutPYZ1.pyz/threading'> ignored"


Der registreres ingen fejl i hændelsesloggen. Jeg har været i stand til at spore det tilbage til python logging-modulet. Simpelthen at importere logging modulet synes at forårsage mit problem. Kommentering af importen eliminerer fejlen. Det forekommer mig ret klart, at dette forårsager problemet, men jeg finder det er mærkeligt, at pyinstaller ville have problemer med et modul i standardbiblioteket. Har nogen andre kørt ind i dette?


Jeg kører Python 2.6.6, Pyinstaller 1.5.1, Build 217 i Pywin32. Jeg er på Windows XP.


Og en fjernet version af min kode:


import win32service
import win32serviceutil
import win32event
import win32evtlogutil
import win32traceutil
import servicemanager
import sys
import os
import time

class myservice(win32serviceutil.ServiceFramework):
    \_svc\_name\_ = "5"
    \_svc\_display\_name\_ = "5"
    \_svc\_deps\_ = ["EventLog"]

    def \_\_init\_\_(self, args):
        self.isAlive = True
        win32serviceutil.ServiceFramework.\_\_init\_\_(self, args)
        self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)

    def event\_log(self, msg):
        servicemanager.LogInfoMsg(str(msg))

    def SvcStop(self):
        # tell Service Manager we are trying to stop (required)
        self.ReportServiceStatus(win32service.SERVICE\_STOP\_PENDING)

        print "svcstop: stopping service, setting event"
        # set the event to call
        win32event.SetEvent(self.hWaitStop)

        print "svcstop: ending svcstop"

    def SvcDoRun(self):
        print "we are starting the service..."
        self.event\_log("Starting \%s" \% self.\_svc\_name\_)


    ############ IF LOGGING IS COMMENTED OUT, THE ERROR GOES AWAY################
        import logging
        print "svcdorun: waiting for object"
        win32event.WaitForSingleObject(self.hWaitStop,win32event.INFINITE)
        print "svcdorun: return from function"

if \_\_name\_\_ == '\_\_main\_\_':
    if len(sys.argv)==1:
        import win32traceutil
        print "service is starting..."

        #servicemanager.Initialize()
        servicemanager.Initialize('backup service', None)
        servicemanager.PrepareToHostSingle(myservice)
        # Now ask the service manager to fire things up for us...
        servicemanager.StartServiceCtrlDispatcher()

        print "service done!"
    else:
        win32serviceutil.HandleCommandLine(myservice)

Bedste reference