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的一些用法分享
Oct 07 Python
Python实现的二维码生成小软件
Jul 11 Python
Python解析nginx日志文件
May 11 Python
Python使用tablib生成excel文件的简单实现方法
Mar 16 Python
使用python绘制常用的图表
Aug 27 Python
Django 跨域请求处理的示例代码
May 02 Python
flask-restful使用总结
Dec 04 Python
python3 自动识别usb连接状态,即对usb重连的判断方法
Jul 03 Python
Python3+Appium安装使用教程
Jul 05 Python
python实现银行管理系统
Oct 25 Python
浅析python中while循环和for循环
Nov 19 Python
使用apiDoc实现python接口文档编写
Nov 19 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
javascript,php获取函数参数对象的代码
2011/02/03 PHP
PHP闭包实例解析
2014/09/08 PHP
PHP实现绘制3D扇形统计图及图片缩放实例
2014/10/01 PHP
PHP生成json和xml类型接口数据格式
2015/05/17 PHP
php判断用户是否手机访问代码
2015/06/08 PHP
Laravel的throttle中间件失效问题解决方法
2016/10/09 PHP
php输出文字乱码的解决方法
2019/10/04 PHP
PHP 代码简洁之道(小结)
2019/10/16 PHP
javascript实现仿银行密码输入框效果的代码
2007/12/13 Javascript
window.open关于浏览器拦截问题分析及解决方法
2013/02/05 Javascript
Javascript对象属性方法汇总
2013/11/21 Javascript
JavaScript监听文本框回车事件并过滤文本框空格的方法
2015/04/16 Javascript
javascript十六进制及二进制转化的方法
2015/05/06 Javascript
程序员必知35个jQuery 代码片段
2015/11/05 Javascript
JavaScript学习笔记之数组随机排序
2016/03/23 Javascript
jquery实现跳到底部,回到顶部效果的简单实例(类似锚)
2016/07/10 Javascript
用最简单的方法判断JavaScript中this的指向(推荐)
2017/09/04 Javascript
vue中使用vue-pdf的方法详解
2020/09/05 Javascript
[47:42]完美世界DOTA2联赛PWL S2 GXR vs Ink 第一场 11.19
2020/11/20 DOTA
对于Python的Django框架部署的一些建议
2015/04/09 Python
python利用OpenCV2实现人脸检测
2020/04/16 Python
Python实战购物车项目的实现参考
2019/02/20 Python
python代码实现逻辑回归logistic原理
2019/08/07 Python
Python实现括号匹配方法详解
2020/02/10 Python
Python要求O(n)复杂度求无序列表中第K的大元素实例
2020/04/02 Python
Python类super()及私有属性原理解析
2020/06/15 Python
Django搭建项目实战与避坑细节详解
2020/12/06 Python
jurlique茱莉蔻英国官网:澳洲天然护肤品
2018/08/03 全球购物
自荐信要包含哪些内容
2013/11/06 职场文书
清正廉洁演讲稿
2014/05/22 职场文书
党员志愿者活动总结
2014/06/26 职场文书
产品委托授权书范本
2014/09/16 职场文书
学校领导干部民主生活会整改方案
2014/09/29 职场文书
民主生活会发言材料
2014/10/20 职场文书
React forwardRef的使用方法及注意点
2021/06/13 Javascript
JS前端使用canvas实现物体的点选示例
2022/08/05 Javascript