将一个Python脚本做成一个Windows服务
问题描述:假设我们有一个Python脚本,这个脚本是一个后台任务,需要在Windows系统中长时间运行。为了方便管理和监控,我们希望将这个脚本封装成一个Windows服务。这样,我们可以使用服务管理器来启动、停止、重启和监控这个脚本。
解决方案
第一步:安装pywin32模块
在命令行中执行以下命令来安装pywin32模块:pip install pywin32
第二步:创建服务脚本
在Python脚本中,我们需要引入win32service和win32serviceutil模块来创建和管理服务。
以下是一个简单的示例脚本,它可以作为一个Windows服务运行并定期输出一条日志信息:
## 代码块1 import win32serviceutil import win32service import win32event import servicemanager import socket import os import sys import logging import inspect import time # 服务名称 svc_name = 'MyService' # 服务显示名称 svc_display_name = 'My Service' # 服务描述 svc_description = 'This is a sample service.' # 服务日志文件路径 svc_log_file = r'C:\path\to\log_file.txt' # 日志格式 log_format = '[%(asctime)s] %(levelname)s: %(message)s' logging.basicConfig(filename=svc_log_file, level=logging.INFO, format=log_format) class MyService(win32serviceutil.ServiceFramework): _svc_name_ = svc_name _svc_display_name_ = svc_display_name _svc_description_ = svc_description def __init__(self, args): win32serviceutil.ServiceFramework.__init__(self, args) self.hWaitStop = win32event.CreateEvent(None, 0, 0, None) socket.setdefaulttimeout(60) self.is_running = True def SvcStop(self): self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) win32event.SetEvent(self.hWaitStop) self.is_running = False def SvcDoRun(self): servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE, servicemanager.PYS_SERVICE_STARTED, (self._svc_name_, '')) self.main() def main(self): while self.is_running: logging.info('Service is running...') # 在这里编写你的任务代码 time.sleep(5)在这个示例中,我们定义了一个名为MyService的类,继承自win32serviceutil.ServiceFramework。我们需要在这个类中实现SvcDoRun方法来定义服务的主逻辑。在本例中,我们简单地输出一条日志信息,并通过time.sleep(5)来模拟一个长时间运行的任务。 if __name__ == '__main__': if len(sys.argv) == 1: servicemanager.Initialize() servicemanager.PrepareToHostSingle(MyService) servicemanager.StartServiceCtrlDispatcher() else: win32serviceutil.HandleCommandLine(MyService)
在这个示例中,我们定义了一个名为MyService的类,继承自win32serviceutil.ServiceFramework。我们需要在这个类中实现SvcDoRun方法来定义服务的主逻辑。在本例中,我们简单地输出一条日志信息,并通过time.sleep(5)来模拟一个长时间运行的任务。
第三步:安装服务
打开命令提示符窗口,切换到脚本所在的目录。
执行以下命令来安装服务:python xx.py install
这将会创建一个Windows服务并注册到服务管理器中。
第四步:启动服务
执行以下命令来启动服务:python xx.py start
第五步:管理服务
可以使用以下命令来管理服务:
停止服务:python script.py stop
重启服务:python script.py restart
删除服务:python script.py remove

序列图:
sequenceDiagram
participant User
participant Service
User->>Service: 启动服务
Service->>User: 服务已启动
User->>Service: 停止服务
Service->>User: 服务已停止
User->>Service: 重启服务
Service->>User: 服务已重启
User->>Service:
如下图,创建的服务My Service如下:

-----------------------------------
©著作权归作者所有:来自51CTO博客作者mob64ca12f5c08e的原创作品,请联系作者获取转载授权,否则将追究法律责任
如何把一个python 脚本做成一个windows 服务
https://blog.51cto.com/u_16213454/9371117

浙公网安备 33010602011771号