Код службы Windows выдает ошибку многопоточности при использовании Pywin32 / PyInstaller - PullRequest
3 голосов
/ 27 марта 2012

Я получаю сообщение об ошибке при использовании python exe, сгенерированного из pyinstaller, для создания службы Windows.Сообщение об ошибке может быть безобидным и, похоже, не влияет на работу службы, но я не уверен, что есть другие проблемы, происходящие за кулисами.Я использую библиотеки pywin32 для установки приложения в качестве службы Windows.Я должен отметить, что я не получаю эту ошибку при установке из самого скрипта python, использующего PythonService.exe из pywin32, только из исполняемого файла, созданного с помощью pyinstaller.

При использовании pyinstaller я могу сгенерировать exe изМой код службы Windows и установить его, нет проблем.Я тоже могу запустить сервис, без проблем.Я даже могу остановить службу, и приложение, кажется, закрывается должным образом.Однако, как только я инициировал остановку, я получаю следующую ошибку на консоли при запуске win32traceutil.py:

"Exception KeyError: KeyError(2244,) in <module 'threading' from '2\build\pyi.win32\agentservice\outPYZ1.pyz/threading'> ignored"

. В журнал событий ошибок не записывается.Я был в состоянии проследить это назад к модулю регистрации Python.Кажется, простой импорт модуля регистрации вызывает мою проблему.Закомментирование импорта устраняет ошибку.Мне кажется довольно ясным, что это вызывает проблему, но я нахожу странным, что у pyinstaller будут проблемы с модулем в стандартной библиотеке.Кто-нибудь еще сталкивался с этим?

Я использую Python 2.6.6, Pyinstaller 1.5.1, сборка 217 Pywin32.Я на Windows XP.

И урезанная версия моего кода:

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)
...