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 Queue模块详细介绍及实例
Dec 27 Python
python爬虫之BeautifulSoup 使用select方法详解
Oct 23 Python
详解Python nose单元测试框架的安装与使用
Dec 20 Python
python web基础之加载静态文件实例
Mar 20 Python
Python 实现字符串中指定位置插入一个字符
May 02 Python
Centos下实现安装Python3.6和Python2共存
Aug 15 Python
[原创]Python入门教程1. 基本运算【四则运算、变量、math模块等】
Oct 28 Python
python实现公司年会抽奖程序
Jan 22 Python
Python 利用高德地图api实现经纬度与地址的批量转换
Aug 14 Python
Python 导入文件过程图解
Oct 15 Python
python+adb命令实现自动刷视频脚本案例
Apr 23 Python
详解python模块pychartdir安装及导入问题
Oct 22 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 addslashes 函数详细分析说明
2009/06/23 PHP
浅谈php优化需要注意的地方
2014/11/27 PHP
PHP的引用详解
2015/02/22 PHP
thinkphp5.0整合phpsocketio完整攻略(绕坑)
2018/10/12 PHP
JavaScript对象之间的转换 jQuery对象和原声DOM
2011/03/07 Javascript
js 3种归并操作的实例代码
2013/10/30 Javascript
jQuery实现仿腾讯视频列表分页效果的方法
2015/08/07 Javascript
浅谈JavaScript 浏览器对象
2016/06/03 Javascript
JavaScript实现url参数转成json形式
2016/09/25 Javascript
基于bootstrap实现收缩导航条
2017/03/17 Javascript
jQuery使用JSONP实现跨域获取数据的三种方法详解
2017/05/04 jQuery
bootstrap实现点击删除按钮弹出确认框的实例代码
2018/08/16 Javascript
微信小程序实现定位及到指定位置导航的示例代码
2019/08/20 Javascript
axios如何利用promise无痛刷新token的实现方法
2019/08/27 Javascript
OpenLayers3实现鼠标移动显示坐标
2020/09/25 Javascript
使用python绘制人人网好友关系图示例
2014/04/01 Python
多版本Python共存的配置方法
2017/05/22 Python
Python统计单词出现的次数
2018/04/04 Python
使用tensorflow实现线性回归
2018/09/08 Python
Python合并同一个文件夹下所有PDF文件的方法
2019/03/11 Python
python中sys模块是做什么用的
2020/08/16 Python
详解BeautifulSoup获取特定标签下内容的方法
2020/12/07 Python
Python数据分析库pandas高级接口dt的使用详解
2020/12/11 Python
Lookfantastic葡萄牙官方网站:欧洲第一大化妆品零售商
2018/03/17 全球购物
社区党总支书记先进事迹材料
2014/01/24 职场文书
求职信范文大全
2014/05/26 职场文书
公司年底活动方案
2014/08/17 职场文书
大学感恩节活动总结
2015/05/05 职场文书
餐馆开业致辞
2015/08/01 职场文书
法律服务所工作总结
2015/08/10 职场文书
廉洁自律准则学习心得体会
2016/01/13 职场文书
妇产科护理心得体会
2016/01/22 职场文书
诗词赏析-(浣溪沙)
2019/08/13 职场文书
springboot+VUE实现登录注册
2021/05/27 Vue.js
Vue过滤器(filter)实现及应用场景详解
2021/06/15 Vue.js
CSS实现九宫格布局(自适应)的示例代码
2022/02/12 HTML / CSS