Я получаю сообщение об ошибке при использовании 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)