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获取脚本所在目录的正确方法
Apr 15 Python
TensorFlow实现Softmax回归模型
Mar 09 Python
Python简单实现查找一个字符串中最长不重复子串的方法
Mar 26 Python
python随机取list中的元素方法
Apr 08 Python
Python利用递归实现文件的复制方法
Oct 27 Python
Python中判断子串存在的性能比较及分析总结
Jun 23 Python
Python hashlib模块实例使用详解
Dec 24 Python
如何基于Python创建目录文件夹
Dec 31 Python
Python字典fromkeys()方法使用代码实例
Jul 20 Python
Python函数__new__及__init__作用及区别解析
Aug 31 Python
python实现快速文件格式批量转换的方法
Oct 16 Python
python3中for循环踩过的坑记录
Dec 14 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 获取客户端的真实ip
2009/11/30 PHP
php中计算中文字符串长度、截取中文字符串的函数代码
2011/08/09 PHP
Yii分页用法实例详解
2014/12/04 PHP
PHP使用逆波兰式计算工资的方法
2015/07/29 PHP
WordPress开发中短代码的实现及相关函数使用技巧
2016/01/05 PHP
基于laravel制作APP接口(API)
2016/03/15 PHP
PHP最常用的正则表达式
2017/02/13 PHP
thinkPHP框架动态配置用法实例分析
2018/06/14 PHP
实例讲解php实现多线程
2019/01/27 PHP
thinkphp5.1 框架钩子和行为用法实例分析
2020/05/25 PHP
DOM 基本方法
2009/07/18 Javascript
JS随机生成不重复数据的实例方法
2013/07/17 Javascript
Jquery使用Firefox FireBug插件调试Ajax步骤讲解
2013/12/02 Javascript
深入分析JQuery和JavaScript的异同
2014/10/23 Javascript
JavaScript正则表达式的分组匹配详解
2016/02/13 Javascript
jqueryMobile 动态添加元素,展示刷新视图的实现方法
2016/05/28 Javascript
mvc 、bootstrap 结合分布式图简单实现分页
2016/10/10 Javascript
深入理解Promise.all
2018/08/08 Javascript
详解Vue组件之间通信的七种方式
2019/04/14 Javascript
一文了解vue-router之hash模式和history模式
2019/05/31 Javascript
javascript实现fetch请求返回的统一拦截
2019/12/22 Javascript
解决VUE mounted 钩子函数执行时 img 未加载导致页面布局的问题
2020/07/27 Javascript
Vue props中Object和Array设置默认值操作
2020/07/30 Javascript
[54:47]Liquid vs VP Supermajor决赛 BO 第五场 6.10
2018/07/05 DOTA
[03:24][TI9纪实] Dota奶爸
2019/08/22 DOTA
Python任意字符串转16, 32, 64进制的方法
2019/06/12 Python
python搜索包的路径的实现方法
2019/07/19 Python
python英语单词测试小程序代码实例
2019/09/09 Python
python判断变量是否为int、字符串、列表、元组、字典的方法详解
2020/02/13 Python
canvas里面如何基于随机点绘制一个多边形的方法
2018/06/13 HTML / CSS
网络安全类面试题
2015/08/01 面试题
初一体育教学反思
2014/01/29 职场文书
班主任工作经验材料
2014/02/02 职场文书
小学生作文评语大全
2014/04/21 职场文书
简爱电影观后感
2015/06/10 职场文书
使用Ajax实现无刷新上传文件
2022/04/12 Javascript