Python编写Windows Service服务程序


Posted in Python onJanuary 04, 2018

 如果你想用Python开发Windows程序,并让其开机启动等,就必须写成windows的服务程序Windows Service,用Python来做这个事情必须要借助第三方模块pywin32,自己去下载然后安装(注意下载符合自己OS的版本)。

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系统会提示:

Python编写Windows Service服务程序

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 相关文章推荐
使用python将mdb数据库文件导入postgresql数据库示例
Feb 17 Python
Python内置函数Type()函数一个有趣的用法
Feb 18 Python
python实现的简单RPG游戏流程实例
Jun 28 Python
python反编译学习之字节码详解
May 19 Python
在Qt中正确的设置窗体的背景图片的几种方法总结
Jun 19 Python
python3+PyQt5 自定义窗口部件--使用窗口部件样式表的方法
Jun 26 Python
python面试题之列表声明实例分析
Jul 08 Python
简单了解Django ContentType内置组件
Jul 23 Python
python按行读取文件并找出其中指定字符串
Aug 08 Python
Django admin model 汉化显示文字的实现方法
Aug 12 Python
Python爬虫爬取糗事百科段子实例分享
Jul 31 Python
简单谈谈Python面向对象的相关知识
Jun 28 Python
微信跳一跳python辅助软件思路及图像识别源码解析
Jan 04 #Python
Python操作MongoDB数据库的方法示例
Jan 04 #Python
Python字典操作详细介绍及字典内建方法分享
Jan 04 #Python
Python tkinter实现的图片移动碰撞动画效果【附源码下载】
Jan 04 #Python
Python给你的头像加上圣诞帽
Jan 04 #Python
Python编程实现线性回归和批量梯度下降法代码实例
Jan 04 #Python
Python语言描述随机梯度下降法
Jan 04 #Python
You might like
php file_exists 检查文件或目录是否存在的函数
2010/05/10 PHP
ThinkPHP实现将SESSION存入MYSQL的方法
2014/07/22 PHP
php实现的操作excel类详解
2016/01/15 PHP
Yii1.1中通过Sql查询进行的分页操作方法
2017/03/16 PHP
php正则判断是否为合法身份证号的方法
2017/03/16 PHP
php探针不显示内存解决方法
2019/09/17 PHP
cssQuery()的下载与使用方法
2007/01/12 Javascript
在JavaScript中遭遇级联表达式陷阱
2007/03/08 Javascript
潜说js对象和数组
2011/05/25 Javascript
用原生js做个简单的滑动效果的回到顶部
2014/10/15 Javascript
jQuery图片轮播滚动切换代码分享
2020/04/20 Javascript
整理JavaScript创建对象的八种方法
2015/11/03 Javascript
Javascript闭包实例详解
2015/11/29 Javascript
javascript html5实现表单验证
2016/03/01 Javascript
JavaScript数组迭代方法
2017/03/03 Javascript
ThinkPHP+jquery实现“加载更多”功能代码
2017/03/11 Javascript
基于input框覆盖掉数字英文的实例讲解
2017/07/21 Javascript
基于LayUI实现前端分页功能的方法
2017/07/22 Javascript
JavaScript定时器setTimeout()和setInterval()详解
2017/08/18 Javascript
AngularJs 延时器、计时器实例代码
2017/09/16 Javascript
关于layui 弹出层一闪而过就消失的解决方法
2019/09/09 Javascript
layui-table表复选框勾选的所有行数据获取的例子
2019/09/13 Javascript
[04:22]DOTA2大事件之护国神翼
2020/08/14 DOTA
python实现绘制树枝简单示例
2014/07/24 Python
浅谈Python中的zip()与*zip()函数详解
2018/02/24 Python
浅谈python中字典append 到list 后值的改变问题
2018/05/04 Python
tensorflow 打印内存中的变量方法
2018/07/30 Python
对Python 内建函数和保留字详解
2018/10/15 Python
Python适配器模式代码实现解析
2019/08/02 Python
运动鞋中的劳斯莱斯:索康尼(SAUCONY)
2017/08/09 全球购物
英国景点门票网站:attractiontix
2019/08/27 全球购物
Belvilla法国:休闲度假房屋出租
2020/10/03 全球购物
党的群众路线教育学习材料
2014/05/12 职场文书
初三毕业评语
2014/12/26 职场文书
小学教师见习总结
2015/06/23 职场文书
用JS写一个发布订阅模式
2021/11/07 Javascript