Активация службы Windows на pywin32 всегда завершается ошибкой

День, добрый разбираюсь как писать службы на pywin32 - написал службу в которой работает несколько потоков, вот её код:



import win32serviceutil
import win32service
import win32event
import servicemanager
from time import sleep, time
import threading
from sched import scheduler



import os
import smtplib

from email.header import Header
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase

import mimetypes
from email import encoders



class MyService(win32serviceutil.ServiceFramework):
    _svc_name_ = 'Auto-sender_test'
    _svc_display_name_ = 'Тестовая служба'
    _svc_description_ = 'Запускает скрипт аналогичный по структуре моего проекта'

    def __init__(self, args):
        win32serviceutil.ServiceFramework.__init__(self, args)
        self.stop_event = win32event.CreateEvent(None, 0, 0, None)
        self.recipylist = ['[email protected]', '[email protected]', '[email protected]']
        self.text = 'Проверка со стороны службы)'


    def SvcStop(self):
        """Метод будет срабатывать при передачи в командную строку по отношению к скрипту параметра stop"""
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        self.st.cancel(self.st.queue[0])
        self.st.cancel(self.st.queue[0])
        win32event.SetEvent(self.stop_event)


    def SvcRun(self):
        servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
                              servicemanager.PYS_SERVICE_STARTED,
                              (self._svc_name_, ''))

        self.try_thread()
        servicemanager.LogInfoMsg('СРАБОТАЛА ФУНКЦИЯ TRY_THREAD')
        # win32event.WaitForSingleObject(self.stop_event, win32event.INFINITE)

    def try_thread(self):
        """Запускает поток с одним потоком-таймером"""
        t1 = threading.Thread(target=self.try_scheds)
        t1.start()

    def try_scheds(self):
        self.st = scheduler(time, sleep)
        servicemanager.LogInfoMsg('ОЖИДАНИЕ СРАБАТЫВАНИЯ ОТПРАВКИ')
        self.st.enterabs(time()+120, 1, action=self.sender, argument=(self.recipylist, self.text, ))
        servicemanager.LogInfoMsg('ОТПРАВКА ЗАВЕРШЕНА, ОЖИДАНИЕ ПЕРЕЗАПУСКА TRY_SCHEDS')
        self.st.enterabs(time()+120+10, 2, action=self.try_scheds,)
        self.st.run()

if __name__ == '__main__':
    win32serviceutil.HandleCommandLine(MyService)

Мои действия: 1)Службу py файл превратил в exe-шник, c помощью pyinstaller, добавил hidden-import "win32timezone", т.к. он почему-то её не видит. 2)Зарегистрировал службу с помощью autosender.exe install и запускаю с помощью autosender.exe start, служба мгновенно останавливается. Вывод в консоли:

C:\Python\exes\dist>autosender.exe start
Starting service Auto-sender_test
Error starting service: Служба не ответила на запрос своевременно.

Вывод в логах:

-Превышение времени ожидания (30000 мс) при ожидании подключения службы "Тестовая служба рассылки"
-Сбой при запуске службы "Тестовая служба рассылки" из-за ошибки Служба не ответила на запрос своевременно. 

Пробовал добавлять в системных переменных окружения путь до win32 и pywin32_sistem32 как советовали на Stackoferflow, не помогло, та же ошибка. Пробовал в коде вызывать self.ReportServiceStatus(win32service.SERVICE_RUNNING), так же. Пробовал win32event.WaitForSingleObject(self.stop_event, win32event.INFINITE), чтобы ожидал команды stop, не помогло. Пожалуйста покажите, что я не верно реализовал в службе? Часть с методом self.try_thread() проверял отдельно, никаких ошибок нет.


Ответы (0 шт):