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 11 Python
Python中index()和seek()的用法(详解)
Apr 27 Python
python实现冒泡排序算法的两种方法
Mar 10 Python
python爬虫自动创建文件夹的功能
Aug 01 Python
Python matplotlib绘制饼状图功能示例
Sep 10 Python
Django框架序列化与反序列化操作详解
Nov 01 Python
Python笔记之工厂模式
Nov 20 Python
使用 Python 写一个简易的抽奖程序
Dec 08 Python
Spring @Enable模块驱动原理及使用实例
Jun 23 Python
BeautifulSoup获取指定class样式的div的实现
Dec 07 Python
如何用Python编写一个电子考勤系统
Feb 08 Python
详解解Django 多对多表关系的三种创建方式
Aug 23 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文件下载类
2006/12/06 PHP
ThinkPHP3.1新特性之对Ajax的支持更加完善
2014/06/19 PHP
在Mac OS上搭建Nginx+PHP+MySQL开发环境的教程
2015/12/21 PHP
非集成环境的php运行环境(Apache配置、Mysql)搭建安装图文教程
2016/04/12 PHP
PHP中set_include_path()函数相关用法分析
2016/07/18 PHP
对于this和$(this)的个人理解
2013/09/08 Javascript
开发插件的两个方法jquery.fn.extend与jquery.extend
2013/11/21 Javascript
JavaScript实现对下拉列表值进行排序的方法
2015/07/15 Javascript
浅谈javascript中onbeforeunload与onunload事件
2015/12/10 Javascript
Javascript中的arguments对象
2016/06/20 Javascript
React复制到剪贴板的示例代码
2017/08/22 Javascript
H5+C3+JS实现五子棋游戏(AI篇)
2020/05/28 Javascript
javascript使用正则表达式实现注册登入校验
2020/09/23 Javascript
17个Python小技巧分享
2015/01/23 Python
Django 添加静态文件的两种实现方法(必看篇)
2017/07/14 Python
python 计算数组中每个数字出现多少次--“Bucket”桶的思想
2017/12/19 Python
selenium+python 去除启动的黑色cmd窗口方法
2018/05/22 Python
python文件转为exe文件的方法及用法详解
2019/07/08 Python
浅谈python print(xx, flush = True) 全网最清晰的解释
2020/02/21 Python
python GUI库图形界面开发之PyQt5打印控件QPrinter详细使用方法与实例
2020/02/28 Python
Python bytes string相互转换过程解析
2020/03/05 Python
Python中socket网络通信是干嘛的
2020/05/27 Python
详解利用python识别图片中的条码(pyzbar)及条码图片矫正和增强
2020/11/17 Python
PyCharm 解决找不到新打开项目的窗口问题
2021/01/15 Python
俄罗斯隐形眼镜和眼镜在线商店:Cronos
2020/06/02 全球购物
护理专业毕业生推荐信
2013/10/31 职场文书
饮料业务员岗位职责
2013/12/15 职场文书
2014物价局民主生活会对照检查材料思想汇报
2014/09/24 职场文书
学生喝酒检讨书500字
2014/11/02 职场文书
2014年团委工作总结
2014/11/13 职场文书
二年级学生期末评语
2014/12/26 职场文书
2015年小学体育教师工作总结
2015/10/23 职场文书
志愿者服务宣传标语口号
2015/12/26 职场文书
MySQL安装后默认自带数据库的作用详解
2021/04/27 MySQL
python调试工具Birdseye的使用教程
2021/05/25 Python
python实现层次聚类的方法
2021/11/01 Python