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程序代码片段
Jun 02 Python
Python中datetime常用时间处理方法
Jun 15 Python
总结用Pdb库调试Python的方式及常用的命令
Aug 18 Python
详解python中字典的循环遍历的两种方式
Feb 07 Python
python实现list元素按关键字相加减的方法示例
Jun 09 Python
python3+PyQt5使用数据库表视图
Apr 24 Python
Python利用splinter实现浏览器自动化操作方法
May 11 Python
对python同一个文件夹里面不同.py文件的交叉引用方法详解
Dec 15 Python
python pandas时序处理相关功能详解
Jul 03 Python
python清空命令行方式
Jan 13 Python
10个python爬虫入门实例(小结)
Nov 01 Python
使用Django的JsonResponse返回数据的实现
Jan 15 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将网址字符串转换成超链接(网址或email)
2010/05/25 PHP
对淘宝URL中ID提取的PHP代码
2013/09/01 PHP
php使用pdo连接并查询sql数据库的方法
2014/12/24 PHP
javascript实现二分查找法实现代码
2007/11/12 Javascript
jQuery 常见开发使用技巧总结
2009/12/26 Javascript
JavaScript中实现块作用域的方法
2010/04/01 Javascript
Dom 结点创建 基础知识
2011/10/01 Javascript
jQuery中DOM操作实例分析
2015/01/23 Javascript
javascript动态添加checkbox复选框的方法
2015/12/23 Javascript
jQuery页面元素动态添加后绑定事件丢失方法,非 live
2016/06/16 Javascript
JS实现弹出居中的模式窗口示例
2016/06/20 Javascript
jquery中关于bind()方法的使用技巧分享
2017/03/30 jQuery
jQuery实现动态加载select下拉列表项功能示例
2018/05/31 jQuery
nodejs基础之多进程实例详解
2018/12/27 NodeJs
JavaScript简单实现的仿微博留言功能示例
2019/01/17 Javascript
js的新生代垃圾回收知识点总结
2019/08/22 Javascript
layui table 表格上添加日期控件的两种方法
2019/09/28 Javascript
详解React的回调渲染模式
2020/09/10 Javascript
JavaScript中常用的3种弹出提示框(alert、confirm、prompt)
2020/11/10 Javascript
[05:28]刀塔密之一:团结则存
2014/07/03 DOTA
致Python初学者 Anaconda入门使用指南完整版
2018/04/05 Python
基于DATAFRAME中元素的读取与修改方法
2018/06/08 Python
Python Pandas分组聚合的实现方法
2019/07/02 Python
django 简单实现登录验证给你
2019/11/06 Python
pytorch GAN生成对抗网络实例
2020/01/10 Python
重写django的model下的objects模型管理器方式
2020/05/15 Python
详解CSS的border边框属性及其在CSS3中的新特性
2016/05/10 HTML / CSS
《狐假虎威》教学反思
2014/02/07 职场文书
金融学专业大学生职业生涯规划
2014/03/07 职场文书
敬老院献爱心活动总结
2014/07/08 职场文书
节能环保家庭事迹材料
2014/08/27 职场文书
计划生育目标责任书
2015/05/09 职场文书
药房管理制度范本
2015/08/06 职场文书
扩展多台相同的Web服务器
2021/04/01 Servers
Vue项目中如何封装axios(统一管理http请求)
2021/05/02 Vue.js
SQL Server携程核心系统无感迁移到MySQL实战
2022/06/01 SQL Server