Python 3 Windows Sevice запускается только в режиме отладки

В этом посте я опубликовал ответ, но он не соответствовал стандартам форума. Надеюсь, в этот раз ответ будет соответствовать стандартам форума. Этот код должен быть более понятным и легко читаемым.

В Python 3+ у меня есть следующий класс, который я использую для создания службы Windows (ничего не делает, просто записывает файл журнала):

#MyWindowsService.py import win32serviceutil import servicemanager import win32service import win32event import sys import logging import win32api class MyWindowsService(win32serviceutil.ServiceFramework): _svc_name_ = 'ServiceName' _svc_display_name_ = 'Service Display Name' _svc_description_ = 'Service Full Description' logging.basicConfig( filename = 'c:\\Temp\\{}.log'.format(_svc_name_), level = logging.DEBUG, format = '%(levelname)-7.7s @ %(asctime)s: %(message)s' ) def __init__(self, *args): self.log('Initializing service {}'.format(self._svc_name_)) win32serviceutil.ServiceFramework.__init__(self, *args) self.stop_event = win32event.CreateEvent(None, 0, 0, None) def SvcDoRun(self): self.ReportServiceStatus(win32service.SERVICE_START_PENDING) try: self.log('START: Service start') self.ReportServiceStatus(win32service.SERVICE_RUNNING) self.start() win32event.WaitForSingleObject(self.stop_event, win32event.INFINITE) except Exception as e: self.log('Exception: {}'.format(e)) self.SvcStop() def SvcStop(self): self.log('STOP: Service stopping...') self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) self.stop() win32event.SetEvent(self.stop_event) self.ReportServiceStatus(win32service.SERVICE_STOPPED) def log(self, msg): servicemanager.LogInfoMsg(str(msg)) #system log logging.info(str(msg)) #text log def start(self): self.runflag = True while self.runflag: win32api.Sleep((2*1000), True) self.log('Service alive') def stop(self): self.runflag = False self.log('Stop received') if __name__ == '__main__': win32serviceutil.HandleCommandLine(MyWindowsService) 

В сценарии я использую файл журнала, чтобы проверить, правильно ли он работает. Я запускаю python3.6 (также пытался с python3.4) в Windows 7, и у меня возникает следующая проблема. Когда я запускаю python MyWindowsService.py install в python MyWindowsService.py install строке указано, что служба была установлена ​​(но ничего не записано в файле журнала). Если я попытаюсь запустить службу, я получаю Service Error: 1 – Дополнительная информация NET HELPMSG 3547, которая мало говорит об ошибке. Если я запускаю python MyWindowsService.py debug , программа работает нормально (файл журнала написан), но все же у меня нет никакого контроля над службой: если я открою другое приглашение и попытаюсь остановить / запустить службу, я все еще получили те же результаты, что и выше.

Я также попытался вставить некоторый код отладки внутри функции init , а когда я запустил установку myWindowsService.py python, кажется, что он не вызван. Является ли это возможным?

Я проверил множество решений и обходных решений вокруг сети, но я не нашел ничего подходящего. Что мне не хватает?

    Как было отмечено eriksun в комментарии к первому сообщению, проблема возникла из местоположения сценария python, который был в диске, сопоставленном с UNC-контуром – я работаю с виртуальной машиной. Перемещение сценария python на том же диске, что и установка python, выполнило эту работу. Чтобы подвести итоги для будущих целей, если служба не запускается, и вы уверены в своем коде, это полезные действия, чтобы попытаться решить ваши проблемы:

    • используйте sc start ServiceName , sc query ServiceName и sc stop ServiceName чтобы получить информацию об услуге.
    • проверьте, находится ли ваш файл на физическом диске или на диске с UNC-сопоставлением. Если последние пытаются запустить сценарий с использованием UNC-пути (например, python \\Server\share\python\your-folder\script.py ) или переместить ваш скрипт на том же диске, что и установка python
    • убедитесь, что «python36.dll», «vcruntime140.dll» и «pywintypes36.dll» либо являются symlink'd в каталоге с PythonService.exe; или symlink'd в каталог System32; или что каталоги с этими DLL находятся в системе (а не в пользовательском) пути
    • Проверьте системный регистр с reg query HKLM\System\CurrentControlSet\Services\your_service_name /s команды reg query HKLM\System\CurrentControlSet\Services\your_service_name /s чтобы получить дополнительную информацию о скрипте

    PLease, не стесняйтесь заполнить, изменить, изменить последнее, чтобы оно могло быть полезным для тех, кто, как я, сталкивался с этой проблемой.

    EDIT: Еще одна вещь … Мой проект, как полагали, работал на самом деле с сетевыми папками (и UNC-сопоставленным диском), и он не удался, когда я попытался запустить его как службу. Один очень полезный (дневной) ресурс, который я использовал для его работы, – это SysinternalsSuite от Марка Руссиновича, который я нашел в этом посте . Надеюсь это поможет.