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判断给定的字符串是否是有效日期的方法
May 13 Python
Python函数式编程指南(三):迭代器详解
Jun 24 Python
利用Python开发实现简单的记事本
Nov 15 Python
python消除序列的重复值并保持顺序不变的实例
Nov 08 Python
Python创建一个空的dataframe,并循环赋值的方法
Nov 08 Python
eclipse创建python项目步骤详解
May 10 Python
Python django框架应用中实现获取访问者ip地址示例
May 17 Python
Python通过len函数返回对象长度
Oct 22 Python
Python修改DBF文件指定列
Dec 19 Python
pyspark对Mysql数据库进行读写的实现
Dec 30 Python
使用Python获取爱奇艺电视剧弹幕数据的示例代码
Jan 12 Python
教你怎么用Python操作MySql数据库
May 31 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
mysql_fetch_assoc和mysql_fetch_row的功能加起来就是mysql_fetch_array
2007/01/15 PHP
dede3.1分页文字采集过滤规则详说(图文教程)续二
2007/04/03 PHP
php INI配置文件的解析实现分析
2011/01/04 PHP
PHP+FFMPEG实现将视频自动转码成H264标准Mp4文件
2014/09/24 PHP
popdiv
2006/07/14 Javascript
ExtJs扩展之GroupPropertyGrid代码
2010/03/05 Javascript
jQuery中after的两种用法实例
2013/07/03 Javascript
一个JS的日期格式化算法示例
2013/07/31 Javascript
深入理解javascript构造函数和原型对象
2014/09/23 Javascript
原生JavaScript编写俄罗斯方块
2015/03/30 Javascript
JavaScript使用slice函数获取数组部分元素的方法
2015/04/06 Javascript
javascript实现树形菜单的方法
2015/07/17 Javascript
Ajax实现不刷新取最新商品
2017/03/01 Javascript
深入理解vue.js中$watch的oldvalue与newValue
2017/08/07 Javascript
详解利用 Vue.js 实现前后端分离的RBAC角色权限管理
2017/09/15 Javascript
Vue项目部署在Spring Boot出现页面空白问题的解决方案
2018/11/26 Javascript
vue.js实现的全选与全不选功能示例【基于elementui】
2018/12/03 Javascript
JavaScript面向对象程序设计中对象的定义和继承详解
2019/07/29 Javascript
js实现3D照片墙效果
2019/10/28 Javascript
详解javascript void(0)
2020/07/13 Javascript
Python isinstance函数介绍
2015/04/14 Python
Python 中的with关键字使用详解
2016/09/11 Python
python xml.etree.ElementTree遍历xml所有节点实例详解
2016/12/04 Python
Mac中升级Python2.7到Python3.5步骤详解
2017/04/27 Python
关于python pyqt5安装失败问题的解决方法
2017/08/08 Python
详解Python 切片语法
2019/06/10 Python
女装和独特珠宝:Sundance Catalog
2018/09/19 全球购物
创造美妙香氛体验:Aera扩散器和香水
2018/11/25 全球购物
单位在职证明范本
2014/01/09 职场文书
项目建议书怎么写
2014/05/15 职场文书
2014领导班子正风肃纪思想汇报
2014/09/18 职场文书
会议邀请函
2015/01/30 职场文书
有关骆驼祥子的读书笔记
2015/06/26 职场文书
2016年元旦致辞
2015/08/01 职场文书
“爱眼护眼,提前预防近视”倡议书3篇
2019/10/30 职场文书
html中两种获取标签内的值的方法
2022/06/16 jQuery