python - 启动使用 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
为.exe
using 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 没有启动。我怎样才能从这里调试这个。请任何人都可以告诉我如何调试它。有什么建议么。?请帮忙。谢谢
解决方案
推荐阅读
- git - git bug:`git add` 添加了比我预期的更多的文件,而 `git diff` 在提交后丢失了它们
- java - 如何将圆的象限旋转一定角度并定义其他角度的 Q?
- r - R Stringr,如何替换长度不同的字符串的一部分?
- python - python递归立即返回
- c++ - Visual Studio 变量作为数组索引
- popup - 防止在双击事件时显示 Mapbox GL JS 弹出窗口
- angular8 - .Net core 3.0 和 angulr8 中的 XMLHttpRequest 错误,从源“https://”访问 url 处的 XMLHttpRequest。已被 CORS 政策阻止
- c++ - 从 1 个 int 输入返回数组的函数
- c# - 将 json 定向到 StructureMap 序列化字节 []
- vb.net - .NET 中的互相关