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基本数据类型详细介绍
Mar 11 Python
采用Psyco实现python执行速度提高到与编译语言一样的水平
Oct 11 Python
python自定义异常实例详解
Jul 11 Python
Python3 replace()函数使用方法
Mar 19 Python
Python爬虫工程师面试问题总结
Mar 22 Python
解决phantomjs截图失败,phantom.exit位置的问题
May 17 Python
Python SQL查询并生成json文件操作示例
Aug 17 Python
在Qt中正确的设置窗体的背景图片的几种方法总结
Jun 19 Python
python文件选择对话框的操作方法
Jun 27 Python
python 含子图的gif生成时内存溢出的方法
Jul 07 Python
python numpy中cumsum的用法详解
Oct 17 Python
python pygame实现挡板弹球游戏
Nov 25 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
ip签名探针
2006/10/09 PHP
第七节--类的静态成员
2006/11/16 PHP
php学习之 循环结构实现代码
2011/06/09 PHP
PHP获取MSN好友列表类的实现代码
2013/06/23 PHP
浅析php数据类型转换
2014/01/09 PHP
PHP的fsockopen、pfsockopen函数被主机商禁用的解决办法
2014/07/08 PHP
php动态生成缩略图并输出显示的方法
2015/04/20 PHP
功能强大的PHP发邮件类
2016/08/29 PHP
php实现通过soap调用.Net的WebService asmx文件
2017/02/27 PHP
javascript中的onkeyup和onkeydown区别介绍
2013/04/28 Javascript
javascript:void(0)是什么意思示例介绍
2013/11/17 Javascript
JavaScript中使用arguments获得函数传参个数实例
2014/08/27 Javascript
用js判断是否为360浏览器的实现代码
2015/01/15 Javascript
IE下支持文本框和密码框placeholder效果的JQuery插件分享
2015/01/31 Javascript
jquery实现动态操作select选中
2015/02/11 Javascript
ECMAScript6函数剩余参数(Rest Parameters)
2015/06/12 Javascript
jquery实现仿新浪微博评论滚动效果
2015/08/06 Javascript
javascript常用函数(1)
2015/11/04 Javascript
如何解决hover在ie6中的兼容性问题
2016/12/15 Javascript
深入学习 JavaScript中的函数调用
2017/03/23 Javascript
微信小程序实现点击按钮修改view标签背景颜色功能示例【附demo源码下载】
2017/12/06 Javascript
Element-ui自定义table表头、修改列标题样式、添加tooltip、:render-header使用
2019/04/11 Javascript
Vue的路由及路由钩子函数的实现
2019/07/02 Javascript
20道JS原理题助你面试一臂之力(必看)
2019/07/22 Javascript
JS中箭头函数与this的写法和理解
2021/01/14 Javascript
[46:10]2014 DOTA2国际邀请赛中国区预选赛 CnB VS HGT
2014/05/21 DOTA
python计数排序和基数排序算法实例
2014/04/25 Python
Python IDE PyCharm的基本快捷键和配置简介
2015/11/04 Python
一波神奇的Python语句、函数与方法的使用技巧总结
2015/12/08 Python
python使用pycharm环境调用opencv库
2018/02/11 Python
python实现决策树、随机森林的简单原理
2018/03/26 Python
质检的岗位职责
2013/11/17 职场文书
实习教师自我鉴定
2013/12/12 职场文书
办公自动化专业大学生职业规划书
2014/03/06 职场文书
2014小学数学教师个人工作总结
2014/12/18 职场文书
Go使用协程交替打印字符
2021/04/29 Golang