Python编写Windows Service服务程序

蓝鲸
蓝鲸
发布时间:2026-10-13| 2人浏览过
原创

本文详细介绍如何使用Python和第三方模块pywin32开发Windows系统服务。通过解析PythonService框架,说明SvcDoRun与SvcStop函数的运行机制,以及如何实现服务开机自启、安装、启动、停止和卸载等完整生命周期管理,帮助开发者轻松将Python脚本转化为后台常驻服务。

若需使用Python开发Windows程序并实现开机自启动等功能,必须将其编写为Windows服务(Windows Service)。在Python中实现此功能需借助第三方模块pywin32,用户需自行下载并安装符合当前操作系统版本的该模块。

1.示例分析

1)幸运的是,存在一个简单的服务模板,足以满足大多数场景的需求:

#encoding=utf-8 
#ZPF 
import win32serviceutil 
import win32service 
import win32event 
 
class PythonService(win32serviceutil.ServiceFramework): 
 #服务名 
 _svc_name_ = "PythonService" 
 #服务在windows系统中显示的名称 
 _svc_display_name_ = "Python Service Test" 
 #服务的描述 
 _svc_description_ = "This code is a Python service Test" 
 
 def __init__(self, args): 
  win32serviceutil.ServiceFramework.__init__(self, args) 
  self.hWaitStop = win32event.CreateEvent(None, 0, 0, None) 
 
 def SvcDoRun(self): 
  # 把自己的代码放到这里,就OK 
  # 等待服务被停止 
  win32event.WaitForSingleObject(self.hWaitStop, win32event.INFINITE) 
    
 def SvcStop(self): 
  # 先告诉SCM停止这个过程 
  self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) 
  # 设置事件 
  win32event.SetEvent(self.hWaitStop) 
 
if __name__=='__main__': 
 win32serviceutil.HandleCommandLine(PythonService) 
 #括号里参数可以改成其他名字,但是必须与class类名一致; 

2)代码解析:在PythonService类的__init__函数执行完毕后,系统服务即开始启动。Windows系统会自动调用SvcDoRun函数。该函数的执行过程不能结束,因为一旦结束即代表服务停止。因此,当在SvcDoRun函数中放置自定义代码时,必须确保该函数不会退出;若函数退出或未能正常运行,则视为服务停止,此时Windows系统会提示相关错误信息。

3)当执行停止服务操作时,系统会调用SvcDoStop函数。该函数通过设置标志位等方式使SvcDoRun函数退出,从而实现服务的正常停止。示例中通过event事件机制让SvcDoRun函数停止等待,进而退出该函数,最终使服务停止。

4)注意:系统关机时不会调用SvcDoStop函数,因此这种服务可以设置为开机自启动。

2.实例

通常通过在SvcDoRun函数中设置循环来确保其不退出。查看示例,通过设置标志位run来实现这一逻辑:

#ZPF 
#encoding=utf-8 
import win32serviceutil 
import win32service 
import win32event 
import os 
import logging 
import inspect 
 
class PythonService(win32serviceutil.ServiceFramework): 
 
 _svc_name_ = "PythonService" 
 _svc_display_name_ = "Python Service Test" 
 _svc_description_ = "This is a python service test code " 
 
 def __init__(self, args): 
  win32serviceutil.ServiceFramework.__init__(self, args) 
  self.hWaitStop = win32event.CreateEvent(None, 0, 0, None) 
  self.logger = self._getLogger() 
  self.run = True 
   
 def _getLogger(self): 
   
  logger = logging.getLogger('[PythonService]') 
   
  this_file = inspect.getfile(inspect.currentframe()) 
  dirpath = os.path.abspath(os.path.dirname(this_file)) 
  handler = logging.FileHandler(os.path.join(dirpath, "service.log")) 
   
  formatter = logging.Formatter('%(asctime)s %(name)-12s %(levelname)-8s %(message)s') 
  handler.setFormatter(formatter) 
   
  logger.addHandler(handler) 
  logger.setLevel(logging.INFO) 
   
  return logger 
 
 def SvcDoRun(self): 
  import time 
  self.logger.info("service is run....") 
  while self.run: 
   self.logger.info("I am runing....") 
   time.sleep(2) 
    
 def SvcStop(self): 
  self.logger.info("service is stop....") 
  self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) 
  win32event.SetEvent(self.hWaitStop) 
  self.run = False 
 
if __name__=='__main__': 
 win32serviceutil.HandleCommandLine(PythonService) 

4.服务操作命令

以下是对上述服务进行基本操作的命令:

1.安装服务

python PythonService.py install 

2.让服务自动启动

python PythonService.py --startup auto install  

3.启动服务

python PythonService.py start 

4.重启服务

python PythonService.py restart 

5.停止服务

python PythonService.py stop 

6.删除/卸载服务

python PythonService.py remove 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。