1、py文件:
#coding:utf8
import win32serviceutil
import win32service
import win32event
import winerror
import servicemanage
import os,time,sys
from subprocess import Popen, PIPE
import json
import signal
"""
#1.安装服务
python WinPollManager.py install
#2.让服务自动启动
python WinPollManager.py --startup auto install
#3.启动服务
python WinPollManager.py start
#4.重启服务
python WinPollManager.py restart
#5.停止服务
python WinPollManager.py stop
#6.删除/卸载服务
python WinPollManager.py remove
"""
class Anaservice(win32serviceutil.ServiceFramework):
_svc_name_ = "ANAservice" #服务名
_svc_display_name_ = "ANAservice" #在windows中显示的名
_svc_description_ = "Ana service is writen by python" #描述
def __init__(self, args):
win32serviceutil.ServiceFramework.__init__(self, args)
self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
self.isAlive=True
def SvcStop(self):
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
win32event.SetEvent(self.hWaitStop)
self.isAlive=False
def SvcDoRun(self):
while self.isAlive:
#do something here
if __name__=='__main__':
if len(sys.argv) == 1:
try:
evtsrc_dll = os.path.abspath(servicemanager.__file__)
servicemanager.PrepareToHostSingle(Anaservice)
servicemanager.Initialize('Anaservice', evtsrc_dll)
servicemanager.StartServiceCtrlDispatcher()
except win32service.error, details:
if details[0] == winerror.ERROR_FAILED_SERVICE_CONTROLLER_CONNECT:
win32serviceutil.usage()
else:
win32serviceutil.HandleCommandLine(Anaservice)
2,所用系统为win10,软件为VScode,安装服务需要系统权限,以管理员身份打开VScode,在code终端内依次:
#1.安装服务
python test.py install
#2.让服务自动启动
python test.py --startup auto install
#3.启动服务
python test.py start
即可在系统服务列表中看到名为Anaservice的服务进程。
#4.重启服务
python test.py restart
#5.停止服务
python test.py stop
#6.删除/卸载服务
python test.py remove
3,start服务时,提示:服务没有及时响应启动或控制请求,以为是代码写的问题,找了几个版本的代码都存在这个问题,在window事件查看器中,可以看到:
查看服务属性,看到可执行文件的地址为:"C:\Python27\lib\site-packages\win32\PythonService.exe"
于是到相应文件夹找这个exe文件,果然,文件无法运行,提示:由于找不到pywintypes27.dll,*******
网上下载x86 版本的pywintypes27.dll,放到上面那个文件夹下面,再start一下:Starting service MyService,
在服务中,找到Mysevice服务,启动已经不会报错。
【ps:删除服务的方法为:1,以管理员身份运行cmd,然后sc delete 服务名,即可删除服务。或者在python中运行 stop再运行remove指令,】
4 如果连接有数据库,提示相关服务无法启动,到事件查看器里看看是不是数据库连接失败,用户名 密码错误?
5 window中写入文件路径时,注意转义字符问题,'\'是转义字符,写入数据库时,'\'会消失,直接按字符串写入会出错,最好按linux格式'/'写入。