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字符和字符值(ASCII或Unicode码值)转换方法
May 21 Python
Python实现PS图像调整之对比度调整功能示例
Jan 26 Python
python批量获取html内body内容的实例
Jan 02 Python
对Python定时任务的启动和停止方法详解
Feb 19 Python
pandas读取CSV文件时查看修改各列的数据类型格式
Jul 07 Python
详解python中的数据类型和控制流
Aug 08 Python
opencv 获取rtsp流媒体视频的实现方法
Aug 23 Python
Python StringIO如何在内存中读写str
Jan 07 Python
解决python绘图使用subplots出现标题重叠的问题
Apr 30 Python
PyTorch梯度裁剪避免训练loss nan的操作
May 24 Python
分享7个 Python 实战项目练习
Mar 03 Python
Python pyecharts案例超市4年数据可视化分析
Aug 14 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
评分9.0以上的动画电影,剧情除了经典还很燃
2020/03/04 日漫
Zend framework处理一个http请求的流程分析
2010/02/08 PHP
php imagecreatetruecolor 创建高清和透明图片代码小结
2010/05/15 PHP
PHP url 加密解密函数代码
2011/08/26 PHP
php批量删除cookie的简单实现方法
2015/01/26 PHP
PHP网站建设的流程与步骤分享
2015/09/25 PHP
使用Yii2实现主从数据库设置
2016/11/20 PHP
ThinkPHP框架表单验证操作方法
2017/07/19 PHP
js绑定事件this指向发生改变的问题解决方法
2013/04/23 Javascript
解析Jquery中如何把一段html代码动态写入到DIV中(实例说明)
2013/07/09 Javascript
javascript中Number对象的toString()方法分析
2014/12/20 Javascript
jQuery应用之jQuery链用法实例
2015/01/19 Javascript
Jquery使用css方法改变样式实例
2015/05/18 Javascript
基于jQuery实现Ajax验证用户名是否存在实例
2016/03/30 Javascript
AngularJS 如何在控制台进行错误调试
2016/06/07 Javascript
vue.js 使用axios实现下载功能的示例
2018/03/05 Javascript
小程序图片剪裁加旋转的示例代码
2018/07/10 Javascript
Vue2.0中三种常用传值方式(父传子、子传父、非父子组件传值)
2018/08/16 Javascript
vue(2.x,3.0)配置跨域代理
2019/11/27 Javascript
微信小程序实现电子签名并导出图片
2020/05/27 Javascript
vue监听滚动事件的方法
2020/12/21 Vue.js
[57:55]完美世界DOTA2联赛PWL S3 Magma vs Phoenix 第二场 12.12
2020/12/16 DOTA
python套接字流重定向实例汇总
2016/03/03 Python
python实现简单聊天应用 python群聊和点对点均实现
2017/09/14 Python
python 用户交互输入input的4种用法详解
2019/09/24 Python
如何验证python安装成功
2020/07/06 Python
美国第一大药店连锁机构:Walgreens(沃尔格林)
2019/10/10 全球购物
银行领导证婚词
2014/01/11 职场文书
上课迟到检讨书
2014/02/19 职场文书
大学生怎样写好自荐信
2014/02/25 职场文书
爱情寄语大全
2014/04/09 职场文书
国富论读书笔记
2015/06/26 职场文书
小学美术教学反思
2016/02/17 职场文书
html+css实现文字折叠特效实例
2021/06/02 HTML / CSS
WINDOWS 64位 下安装配置mysql8.0.25最详细的教程
2022/03/22 MySQL
Redis主从复制操作和配置详情
2022/09/23 Redis