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提取html文件中的特定数据的实现代码
Mar 24 Python
python进阶教程之异常处理
Aug 30 Python
Python3写入文件常用方法实例分析
May 22 Python
Python的时间模块datetime详解
Apr 17 Python
python多进程和多线程究竟谁更快(详解)
May 29 Python
Python类的继承和多态代码详解
Dec 27 Python
python获取网页中所有图片并筛选指定分辨率的方法
Mar 31 Python
Python爬虫实现“盗取”微信好友信息的方法分析
Sep 16 Python
Python如何实现小程序 无限求和平均
Feb 18 Python
Nginx+Uwsgi+Django 项目部署到服务器的思路详解
May 08 Python
Keras使用ImageNet上预训练的模型方式
May 23 Python
Python 中的Sympy详细使用
Aug 07 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
星际争霸 Starcraft 秘技补丁
2020/03/14 星际争霸
PHP水印类,支持添加图片、文字、填充颜色区域的实现
2017/02/04 PHP
Swoole 5将移除自动添加Event::wait()特性详解
2019/07/10 PHP
PHP面向对象程序设计中的self、static、parent关键字用法分析
2019/08/14 PHP
jQuery的链式调用浅析
2010/12/03 Javascript
jQuery-Easyui 1.2 实现多层菜单效果的代码
2012/01/13 Javascript
jquery仿QQ商城带左右按钮控制焦点图片切换滚动效果
2013/06/27 Javascript
javascript dom追加内容实现示例
2013/09/21 Javascript
将中国标准时间转换成标准格式的代码
2014/03/20 Javascript
js网页右下角提示框实例
2014/10/14 Javascript
javascript实现控制文字大中小显示
2015/04/28 Javascript
javascript实现tab切换特效
2015/11/12 Javascript
全面解析JavaScript里的循环方法之forEach,for-in,for-of
2020/04/20 Javascript
如何解决IONIC页面底部被遮住无法向上滚动问题
2016/09/06 Javascript
Bootstrap源码解读下拉菜单(4)
2016/12/23 Javascript
微信小程序 天气预报开发实例代码源码
2017/01/20 Javascript
Ajax异步文件上传与NodeJS express服务端处理
2017/04/01 NodeJs
angularJs的ng-class切换class
2017/06/23 Javascript
vue cli 全面解析
2018/02/28 Javascript
Javascript 编码约定(编码规范)
2018/03/11 Javascript
详解如何探测小程序返回到webview页面
2019/05/14 Javascript
vue element-ui之怎么封装一个自己的组件的详解
2019/05/20 Javascript
Vue将页面导出为图片或者PDF
2020/08/17 Javascript
vue实现滚动鼠标滚轮切换页面
2020/12/13 Vue.js
python3.3实现乘法表示例
2014/02/07 Python
Python运算符重载用法实例分析
2015/06/01 Python
Bottle框架中的装饰器类和描述符应用详解
2017/10/28 Python
python自动重试第三方包retrying模块的方法
2018/04/24 Python
Python图片的横坐标汉字实例
2019/12/04 Python
基于python实现监听Rabbitmq系统日志代码示例
2020/11/28 Python
联想中国官方商城:Lenovo China
2017/10/18 全球购物
互联网创业计划书的书写步骤
2014/01/28 职场文书
小学主题班会教案
2015/08/17 职场文书
早安问候语大全
2015/11/10 职场文书
如何让vue长列表快速加载
2021/03/29 Vue.js
JavaScript高级程序设计之基本引用类型
2021/11/17 Javascript