首页 > 解决方案 > 启动使用 pyinstaller 编译的 python windows 服务时出错

问题描述

我创建了 python 脚本,它是一个 Windows 服务。下面是代码:

客户端服务.py

import logging
import os
import sys
import psutil
import win32serviceutil
import win32service
import win32event
import servicemanager
import socket
import time
import json
import datetime
from random import randint
from pymongo import MongoClient
from opcua import Client


curr_path = os.path.dirname(os.path.abspath(__file__))
configs_path = os.path.join(curr_path, 'configs', 'app_config.json')
opc_configs_path = os.path.join(curr_path, 'configs', 'opc.json')
log_file_path = os.path.join(curr_path, 'logs', 'application.log')


def setup_logger(logger_name, log_file, level=logging.ERROR):
    l = logging.getLogger(logger_name)
    formatter = logging.Formatter('%(asctime)s %(message)s')
    fileHandler = logging.FileHandler(log_file, mode='a')
    fileHandler.setFormatter(formatter)
    streamHandler = logging.StreamHandler()
    streamHandler.setFormatter(formatter)
    l.setLevel(level)
    l.addHandler(fileHandler)
    l.addHandler(streamHandler)


debug_file = os.path.join(curr_path, 'logs', 'application.log')
setup_logger('debug', debug_file)
log_debug = logging.getLogger('debug')


class AppService(win32serviceutil.ServiceFramework):
    _svc_name_ = "OPC_CLIENT_SERVICE"
    _svc_display_name_ = "OPC_CLIENT_SERVICE"
    _svc_description_ = "OPC_CLIENT_SERVICE"

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

    def SvcStop(self):
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        win32event.SetEvent(self.hWaitStop)
        self.isrunning = False

    def SvcDoRun(self):
        self.isrunning = True
        servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE, servicemanager.PYS_SERVICE_STARTED, (self._svc_name_, ''))

        log_debug.error("STARTED")
        while self.isrunning:
            log_debug.error("Running")
            time.sleep(2)

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

为了测试它,我正在运行以下命令:

> python client_service.py install
    Installing service OPC_CLIENT_SERVICE
    Service installed

> python client_service.py debug
    Debugging service OPC_CLIENT_SERVICE - press Ctrl+C to stop.
    Info 0x40001002 - The OPC_CLIENT_SERVICE service has started.
    2020-09-23 21:15:46,603 STARTED
    2020-09-23 21:15:46,603 Running
    2020-09-23 21:15:48,604 Running
    2020-09-23 21:15:50,606 Running
    Stopping debug service.

> python client_service.py start
    Starting service OPC_CLIENT_SERVICE

> python client_service.py remove
    Removing service OPC_CLIENT_SERVICE
    Service removed

一切正常,这意味着脚本没有问题。后来我将其转换.py.exeusing pyinstaller

pyinstaller --hiddenimport=win32timezone --onefile client_service.py

在此之后,它创建了client_service.exe. 所以我使用了以下命令:

> client_service.exe install
    Installing service OPC_CLIENT_SERVICE
    Service installed

> client_service.exe debug
    Debugging service OPC_CLIENT_SERVICE - press Ctrl+C to stop.
    Info 0x40001002 - The OPC_CLIENT_SERVICE service has started.
    2020-09-23 21:23:35,149 STARTED
    2020-09-23 21:23:35,149 Running
    2020-09-23 21:23:37,150 Running
    2020-09-23 21:23:39,150 Running
    Stopping debug service.

> client_service.exe start
    Starting service OPC_CLIENT_SERVICE
    Error starting service: The service did not respond to the start or control request in a timely fashion.

在这里,我无法理解为什么 exe 没有启动。我怎样才能从这里调试这个。请任何人都可以告诉我如何调试它。有什么建议么。?请帮忙。谢谢

标签: pythonservicepyinstallerpywin32

解决方案


推荐阅读