Я изо всех сил пытался запустить python проект как Windows Сервис. Это задание планировщика, которое выполняет определенные задачи через регулярные промежутки времени. В настоящее время работы запланированы с APSCheduler. Ниже приведен код.
import servicemanager
import socket
import sys
import win32event
import win32service
import win32serviceutil
import datetime
import os
class SchService(win32serviceutil.ServiceFramework):
_svc_name_ = "Schedule"
_svc_display_name_ = "Schedule"
_svc_description_ = "Schedule"
# @classmethod
# def parse_command_line(cls, cmd):
# '''
# ClassMethod to parse the command line
# '''
# win32serviceutil.HandleCommandLine(cls, None, ['', cmd])
def __init__(self, args):
win32serviceutil.ServiceFramework.__init__(self, args)
self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
socket.setdefaulttimeout(60)
def SvcStop(self):
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
win32event.SetEvent(self.hWaitStop)
def SvcDoRun(self):
servicemanager.LogMsg(
servicemanager.EVENTLOG_INFORMATION_TYPE,
servicemanager.PYS_SERVICE_STARTED,
(self._svc_name_, '')
)
rc = None
while rc != win32event.WAIT_OBJECT_0:
with open('C:\\temp\\ScheService.log', 'a') as f:
f.write('Scheduler Running at ... ' + str(datetime.datetime.now()) + '\n')
from sample_schd import scheduler
try:
sch = scheduler.Scheduler()
sch.init_run()
except Exception as e:
print(str(e))
rc = win32event.WaitForSingleObject(self.hWaitStop, 5000)
if __name__ == '__main__':
print (len(sys.argv))
if len(sys.argv) == 1:
servicemanager.Initialize()
servicemanager.PrepareToHostSingle(SchService)
servicemanager.StartServiceCtrlDispatcher()
else:
win32serviceutil.HandleCommandLine(SchService)
Я пытаюсь установить его как службу как Python WindowsService.py install
и Python WindowsService.py start
.
Нет исключений или ошибок, но планировщик не запущен .
sch.init_run () очистит планировщик и добавит новые задания
Шаги проверки, которые я проделал до сих пор:
Python WindowsService.py debug
работает очень хорошо, но запуск не запускает планировщик - Проверенные файлы pywintypes.dll и python38.dll присутствуют в соответствующих местах
- Проверены разрешения в каждом месте, например разрешения на чтение / запись / выполнение
- И PATH, и PYTHONPATH установлены на системном уровне с путем к Python исполняемым файлам
Одно наблюдение, которое у меня было - если я пытаюсь вызвать функцию в другом модуле с помощью импорт, который не работает. В приведенном выше примере я заменил Scheduler на Flask API, предполагая совместимость с APScheduler. но даже это не срабатывает после того, как я импортирую модуль API в файл Windows Service Python.
Пролистал несколько блогов и несколько вопросов SO. но не повезло. Любая помощь по этому вопросу высоко ценится.
Я тестировал с Python 3,6, 3,7 и 3,8. Но ни один из них не сработал.
Заранее спасибо!