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 相关文章推荐
Python3.2中Print函数用法实例详解
May 19 Python
python友情链接检查方法
Jul 08 Python
python之文件的读写和文件目录以及文件夹的操作实现代码
Aug 28 Python
Python+PIL实现支付宝AR红包
Feb 09 Python
PyQt4实现下拉菜单可供选择并打印出来
Apr 20 Python
Python之csv文件从MySQL数据库导入导出的方法
Jun 21 Python
mac安装pytorch及系统的numpy更新方法
Jul 26 Python
Python Unittest根据不同测试环境跳过用例的方法
Dec 16 Python
详解利用OpenCV提取图像中的矩形区域(PPT屏幕等)
Jul 01 Python
python 实现图片上传接口开发 并生成可以访问的图片url
Dec 18 Python
python3 pathlib库Path类方法总结
Dec 26 Python
python实现小程序推送页面收录脚本
Apr 20 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程序员的技术瓶颈分析
2011/07/17 PHP
PHP编程获取图片的主色调的方法【基于Imagick扩展】
2017/08/02 PHP
PHP实现的多维数组排序算法分析
2018/02/10 PHP
thinkphp5框架扩展redis类方法示例
2019/05/06 PHP
Avengerls vs Newbee BO3 第一场2.18
2021/03/10 DOTA
不懂JavaScript应该怎样学
2008/04/16 Javascript
jQuery 判断页面元素是否存在的代码
2009/08/14 Javascript
jquery星级插件、支持页面中多次使用
2012/03/25 Javascript
对于jQuery性能的一些优化建议
2015/08/13 Javascript
第一次动手实现bootstrap table分页效果
2016/09/22 Javascript
Vue实现按钮旋转和移动位置的实例代码
2018/08/09 Javascript
vue2过滤器模糊查询方法
2018/09/16 Javascript
详解如何构建Promise队列实现异步函数顺序执行
2018/10/23 Javascript
Vue加载json文件的方法简单示例
2019/01/28 Javascript
js实现ATM机存取款功能
2020/10/27 Javascript
使用nodejs分离html文件里的js和css详解
2019/04/12 NodeJs
Vuex新手的理解与使用详解
2019/05/31 Javascript
node.js文件操作系统实例详解
2019/11/05 Javascript
JS实现音量控制拖动
2020/01/15 Javascript
原生js实现轮播图特效
2020/05/04 Javascript
简单了解vue 插值表达式Mustache
2020/07/22 Javascript
在VUE中使用lodash的debounce和throttle操作
2020/11/09 Javascript
[56:35]DOTA2上海特级锦标赛C组小组赛#1 OG VS Archon第二局
2016/02/27 DOTA
python实现发送和获取手机短信验证码
2016/01/15 Python
Python实现新浪博客备份的方法
2016/04/27 Python
解决pandas.DataFrame.fillna 填充Nan失败的问题
2018/11/06 Python
在python plt图表中文字大小调节的方法
2019/07/08 Python
python实现代码统计程序
2019/09/19 Python
关于sys.stdout和print的区别详解
2019/12/05 Python
Python2 与Python3的版本区别实例分析
2020/03/30 Python
基于pycharm实现批量修改变量名
2020/06/02 Python
localStorage的过期时间设置的方法详解
2018/11/26 HTML / CSS
编写一个 C 函数,该函数在一个字符串中找到可能的最长的子字符串,且该字符串是由同一字符组成的
2015/07/23 面试题
法律专业推荐信范文
2013/11/29 职场文书
给老师的检讨书
2014/02/11 职场文书
2015年暑期社会实践活动总结
2015/03/27 职场文书