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 相关文章推荐
Mac OS X10.9安装的Python2.7升级Python3.3步骤详解
Dec 04 Python
python将ip地址转换成整数的方法
Mar 17 Python
python实现分析apache和nginx日志文件并输出访客ip列表的方法
Apr 04 Python
python实现对求解最长回文子串的动态规划算法
Jun 02 Python
python实现简单的文字识别
Nov 27 Python
python解析json串与正则匹配对比方法
Dec 20 Python
Python re 模块findall() 函数返回值展现方式解析
Aug 09 Python
使用pytorch搭建AlexNet操作(微调预训练模型及手动搭建)
Jan 18 Python
Python实现新型冠状病毒传播模型及预测代码实例
Feb 05 Python
Python任务自动化工具tox使用教程
Mar 17 Python
在python中实现求输出1-3+5-7+9-......101的和
Apr 02 Python
Python日志:自定义输出字段 json格式输出方式
Apr 27 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
一个ubbcode的函数,速度很快.
2006/10/09 PHP
Linux下进行MYSQL编程时插入中文乱码的解决方案
2007/03/15 PHP
php面向对象全攻略 (一) 面向对象基础知识
2009/09/30 PHP
DEDECMS首页调用图片集里的多张图片
2015/06/05 PHP
thinkPHP框架自动填充原理与用法分析
2018/04/03 PHP
Laravel利用gulp如何构建前端资源详解
2018/06/03 PHP
PHP全局使用Laravel辅助函数dd
2019/12/26 PHP
Tab页界面 用jQuery及Ajax技术实现(php后台)
2011/10/12 Javascript
jquery 插件开发 extjs中的extend用法小结
2013/01/04 Javascript
原生js实现shift/ctrl/alt按键的获取
2013/04/08 Javascript
js数组如何添加json数据及js数组与json的区别
2015/10/27 Javascript
JS实现随页面滚动显示/隐藏窗口固定位置元素
2016/02/26 Javascript
JS组件系列之Bootstrap table表格组件神器【终结篇】
2016/05/10 Javascript
Angular 4.0学习教程之架构详解
2017/09/12 Javascript
windows系统下更新nodejs版本的方案
2017/11/24 NodeJs
jQuery创建及操作xml格式数据示例
2018/05/26 jQuery
Vue中在新窗口打开页面及Vue-router的使用
2018/06/13 Javascript
JSON数据中存在单个转义字符“\”的处理方法
2018/07/11 Javascript
微信小程序—setTimeOut定时器的问题及解决
2019/07/26 Javascript
解决vue更新路由router-view复用组件内容不刷新的问题
2019/11/04 Javascript
JavaScript交换两个变量方法实例
2019/11/25 Javascript
Vue使用JSEncrypt实现rsa加密及挂载方法
2020/02/07 Javascript
微信小程序实现单个或多个倒计时功能
2020/11/01 Javascript
Python解析excel文件存入sqlite数据库的方法
2016/11/15 Python
Python实现的多线程http压力测试代码
2017/02/08 Python
Python实现的将文件每一列写入列表功能示例【测试可用】
2018/03/19 Python
对numpy中shape的深入理解
2018/06/15 Python
Python实现报警信息实时发送至邮箱功能(实例代码)
2019/11/11 Python
Pytorch: 自定义网络层实例
2020/01/07 Python
公共汽车、火车和飞机票的通用在线预订和销售平台:INFOBUS
2019/11/30 全球购物
房展策划方案
2014/06/07 职场文书
学前班幼儿评语大全
2014/12/29 职场文书
研究生论文答辩开场白
2015/05/27 职场文书
体育委员竞选稿
2015/11/21 职场文书
《鲁班学艺》读后感3篇
2019/11/27 职场文书
MySQL数据库如何给表设置约束详解
2022/03/13 MySQL