Python制作Windows系统服务


Posted in Python onMarch 25, 2017

最近有个Python程序需要安装并作为Windows系统服务来运行,过程中碰到一些坑,整理了一下。

Python服务类

首先Python程序需要调用一些Windows系统API才能作为系统服务,具体内容如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import time

import win32api
import win32event
import win32service
import win32serviceutil
import servicemanager


class MyService(win32serviceutil.ServiceFramework):

  _svc_name_ = "MyService"
  _svc_display_name_ = "My Service"
  _svc_description_ = "My Service"

  def __init__(self, args):
    self.log('init')
    win32serviceutil.ServiceFramework.__init__(self, args)
    self.stop_event = win32event.CreateEvent(None, 0, 0, None)

  def SvcDoRun(self):
    self.ReportServiceStatus(win32service.SERVICE_START_PENDING)
    try:
      self.ReportServiceStatus(win32service.SERVICE_RUNNING)
      self.log('start')
      self.start()
      self.log('wait')
      win32event.WaitForSingleObject(self.stop_event, win32event.INFINITE)
      self.log('done')
    except BaseException as e:
      self.log('Exception : %s' % e)
      self.SvcStop()

  def SvcStop(self):
    self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
    self.log('stopping')
    self.stop()
    self.log('stopped')
    win32event.SetEvent(self.stop_event)
    self.ReportServiceStatus(win32service.SERVICE_STOPPED)

  def start(self):
    time.sleep(10000)

  def stop(self):
    pass

  def log(self, msg):
    servicemanager.LogInfoMsg(str(msg))

  def sleep(self, minute):
    win32api.Sleep((minute*1000), True)

if __name__ == "__main__":
  if len(sys.argv) == 1:
    servicemanager.Initialize()
    servicemanager.PrepareToHostSingle(MyService)
    servicemanager.StartServiceCtrlDispatcher()
  else:
    win32serviceutil.HandleCommandLine(MyService)

pyinstaller打包

pyinstaller -F MyService.py

测试

# 安装服务
dist\MyService.exe install

# 启动服务
sc start MyService

# 停止服务
sc stop MyService

# 删除服务
sc delete MyService

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
布同 Python中文问题解决方法(总结了多位前人经验,初学者必看)
Mar 13 Python
Python删除指定目录下过期文件的2个脚本分享
Apr 10 Python
Python极简代码实现杨辉三角示例代码
Nov 15 Python
python模块之re正则表达式详解
Feb 03 Python
python 如何快速找出两个电子表中数据的差异
May 26 Python
Python获取当前页面内所有链接的四种方法对比分析
Aug 19 Python
python实现kNN算法
Dec 20 Python
python flask实现分页的示例代码
Aug 02 Python
Django model.py表单设置默认值允许为空的操作
May 19 Python
Python如何用wx模块创建文本编辑器
Jun 07 Python
Python opencv缺陷检测的实现及问题解决
Apr 24 Python
python小型的音频操作库mp3Play
Apr 24 Python
Python 类的继承实例详解
Mar 25 #Python
python利用拉链法实现字典方法示例
Mar 25 #Python
python3实现ftp服务功能(服务端 For Linux)
Mar 24 #Python
python3实现ftp服务功能(客户端)
Mar 24 #Python
Python 中urls.py:URL dispatcher(路由配置文件)详解
Mar 24 #Python
python 类详解及简单实例
Mar 24 #Python
Python类的动态修改的实例方法
Mar 24 #Python
You might like
php中可能用来加密字符串的函数[base64_encode、urlencode、sha1]
2012/01/16 PHP
PHP函数addslashes和mysql_real_escape_string的区别
2014/04/22 PHP
PHP图片裁剪函数(保持图像不变形)
2014/05/04 PHP
Laravel 5 框架入门(三)
2015/04/09 PHP
PHP使用trim函数去除字符串左右空格及特殊字符实例
2016/01/07 PHP
Hutia 的 JS 代码集
2006/10/24 Javascript
Extjs中使用extend(js继承) 的代码
2012/03/15 Javascript
js脚本获取webform服务器控件的方法
2014/05/16 Javascript
浅谈javascript的调试
2015/01/28 Javascript
跟我学习javascript的函数和函数表达式
2015/11/16 Javascript
jQuery实现网页顶部固定导航效果代码
2015/12/24 Javascript
javascript中的3种继承实现方法
2016/01/27 Javascript
js事件处理程序跨浏览器解决方案
2016/03/27 Javascript
javascript中数组和字符串的方法对比
2016/07/20 Javascript
JS实现点击网页判断是否安装app并打开否则跳转app store
2016/11/18 Javascript
基于Bootstrap 3 JQuery及RegExp的表单验证功能
2017/02/16 Javascript
WebSocket实现简单客服聊天系统
2017/05/12 Javascript
vue.js 图片上传并预览及图片更换功能的实现代码
2018/08/27 Javascript
Nodejs使用archiver-zip-encrypted库加密压缩文件时报错(解决方案)
2019/11/18 NodeJs
jQuery 函数实例分析【函数声明、函数表达式、匿名函数等】
2020/05/19 jQuery
vue 组件之间事件触发($emit)与event Bus($on)的用法说明
2020/07/28 Javascript
python使用mailbox打印电子邮件的方法
2015/04/30 Python
用Python抢过年的火车票附源码
2015/12/07 Python
Python 爬取携程所有机票的实例代码
2018/06/11 Python
对Python3 goto 语句的使用方法详解
2019/02/16 Python
计算机二级python学习教程(2) python语言基本语法元素
2019/05/16 Python
浅谈Python描述数据结构之KMP篇
2020/09/06 Python
世界上最大的专业美容用品零售商:Sally Beauty
2017/07/02 全球购物
金融专业推荐信
2013/11/14 职场文书
房产代理公证处委托书
2014/04/04 职场文书
学校安全教育月活动总结
2014/07/07 职场文书
土木工程专业本科生求职信
2014/10/01 职场文书
党员个人整改方案及措施
2014/10/25 职场文书
解决Golang中goroutine执行速度的问题
2021/05/02 Golang
redis数据结构之压缩列表
2022/03/21 Redis
python如何利用cv2.rectangle()绘制矩形框
2022/12/24 Python