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 select.select模块通信全过程解析
Sep 20 Python
用Python登录好友QQ空间点赞的示例代码
Nov 04 Python
Python下载网络文本数据到本地内存的四种实现方法示例
Feb 05 Python
Python3匿名函数用法示例
Jul 25 Python
python实现汽车管理系统
Nov 30 Python
python递归下载文件夹下所有文件
Aug 31 Python
使用python实现男神女神颜值打分系统(推荐)
Oct 31 Python
python 实现二维列表转置
Dec 02 Python
利用Python代码实现一键抠背景功能
Dec 29 Python
python 图像的离散傅立叶变换实例
Jan 02 Python
Python中操作各种多媒体,视频、音频到图片的代码详解
Jun 04 Python
Python 删除List元素的三种方法remove、pop、del
Nov 16 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
thinkPHP5实现的查询数据库并返回json数据实例
2017/10/23 PHP
PHP使用观察者模式处理异常信息的方法详解
2019/09/24 PHP
本地对象Array的原型扩展实现代码
2010/12/04 Javascript
JQuery里面的几种选择器 查找满足条件的元素$("#控件ID")
2011/08/23 Javascript
jQuery ajax serialize()方法的使用以及常见问题解决
2013/01/27 Javascript
jquery 鼠标滑动显示详情应用示例
2014/01/24 Javascript
点击表单提交时出现jQuery没有权限的解决方法
2014/07/23 Javascript
javascript实现的一个随机点名功能
2014/08/26 Javascript
轻松创建nodejs服务器(10):处理上传图片
2014/12/18 NodeJs
值得分享的Bootstrap Ace模板实现菜单和Tab页效果
2015/12/30 Javascript
4种JavaScript实现简单tab选项卡切换的方法
2016/01/06 Javascript
js如何准确获取当前页面url网址信息
2020/09/13 Javascript
原生JS实现旋转木马式图片轮播插件
2016/04/25 Javascript
JavaScript提高网站性能优化的建议(二)
2016/07/24 Javascript
利用jquery实现瀑布流3种案例
2016/09/18 Javascript
基于Nodejs利用socket.io实现多人聊天室
2017/02/22 NodeJs
JavaScript继承的特性与实践应用深入详解
2018/12/30 Javascript
详解JavaScript的变量
2019/04/04 Javascript
React组件对子组件children进行加强的方法
2019/06/23 Javascript
微信小程序使用前置摄像头拍照
2020/10/22 Javascript
vue3.0实现点击切换验证码(组件)及校验
2020/11/18 Vue.js
Python全局变量与局部变量区别及用法分析
2018/09/03 Python
Python生成器的使用方法和示例代码
2019/03/04 Python
python logging 重复写日志问题解决办法详解
2020/08/04 Python
python从PDF中提取数据的示例
2020/10/30 Python
Python eval函数原理及用法解析
2020/11/14 Python
image-set实现Retina屏幕下图片显示详细介绍
2012/12/24 HTML / CSS
css3.0 图形构成实例练习二
2013/03/19 HTML / CSS
纯CSS3实现的阴影效果
2014/12/24 HTML / CSS
基于 HTML5 WebGL 实现的垃圾分类系统
2019/10/08 HTML / CSS
Ariat官网:美国马靴和服装品牌
2019/12/16 全球购物
戴尔新加坡官网:Dell Singapore
2020/12/13 全球购物
党员个人党性分析材料
2014/12/18 职场文书
观看禁毒宣传片后的感想
2015/08/11 职场文书
中国梦党课学习心得体会
2016/01/05 职场文书
OpenCV全景图像拼接的实现示例
2021/06/05 Python