Запустите код Python 3.8 с APScheduler как Windows Сервис - PullRequest
0 голосов
/ 18 апреля 2020

Я изо всех сил пытался запустить 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 () очистит планировщик и добавит новые задания

Шаги проверки, которые я проделал до сих пор:

  1. Python WindowsService.py debug работает очень хорошо, но запуск не запускает планировщик
  2. Проверенные файлы pywintypes.dll и python38.dll присутствуют в соответствующих местах
  3. Проверены разрешения в каждом месте, например разрешения на чтение / запись / выполнение
  4. И PATH, и PYTHONPATH установлены на системном уровне с путем к Python исполняемым файлам

Одно наблюдение, которое у меня было - если я пытаюсь вызвать функцию в другом модуле с помощью импорт, который не работает. В приведенном выше примере я заменил Scheduler на Flask API, предполагая совместимость с APScheduler. но даже это не срабатывает после того, как я импортирую модуль API в файл Windows Service Python.

Пролистал несколько блогов и несколько вопросов SO. но не повезло. Любая помощь по этому вопросу высоко ценится.

Я тестировал с Python 3,6, 3,7 и 3,8. Но ни один из них не сработал.

Заранее спасибо!

...