0

我使用configparser在 python 中读取配置文件。当脚本转换为Windows 服务时,它会给出错误提示“错误启动服务:服务没有及时响应启动或控制请求。” 我已经增加ServicesPipeTimeout并启用Allow service to interact with desktop了,但它并没有解决问题。

脚本是

import logging
import configparser
import mysql.connector
import socket
import win32event
import win32service
import servicemanager
import win32serviceutil
import sys



logging.basicConfig(
    filename = "C:\\Users\\Administrator\\PythonService.txt",
    level = logging.INFO,
    format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    datefmt='%m/%d/%Y %I:%M:%S %p'
)


def main():
    configaration = configparser.ConfigParser()
    configaration.read('default.ini')
    host = configaration['mysql']['host']
    username = configaration['mysql']['user']
    password = configaration['mysql']['password']
    database = configaration['mysql']['database']
    config = {'user': username,'password': password,'host': host,'database': database}
    logging.info(config)

class TestService(win32serviceutil.ServiceFramework):
    _svc_name_ = "ClientService"
    _svc_display_name_ = "Client Service"

    def __init__(self, args):
        win32serviceutil.ServiceFramework.__init__(self, args)
        self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
        socket.setdefaulttimeout(60)
        self.stop_requested = False

    def SvcStop(self):
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        win32event.SetEvent(self.hWaitStop)
        logging.info('Stopping service ....')
        self.stop_requested = True

    def SvcDoRun(self):
        logging.info("Started service")
        servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
                              servicemanager.PYS_SERVICE_STARTED,
                              (self._svc_name_, ''))

        rc = None
        while rc != win32event.WAIT_OBJECT_0:
            rc = win32event.WaitForSingleObject(self.hWaitStop, 5000)
            if rc == win32event.WAIT_OBJECT_0:
                servicemanager.LogInfoMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
                                          servicemanager.PYS_SERVICE_STARTED,

                                          (self._svc_name_, ''))
                break
            else:
                main()


if __name__ == '__main__':
    if len(sys.argv) == 1:
        servicemanager.Initialize()
        servicemanager.PrepareToHostSingle(TestService)
        servicemanager.StartServiceCtrlDispatcher()
    else:
        win32serviceutil.HandleCommandLine(TestService)

当脚本开始与文件系统中的文件交互时,执行停止。

4

0 回答 0