Python中使用win32service创建Windows服务
发布时间:2023-12-26 15:20:04
要在Python中创建Windows服务,可以使用win32service模块。该模块提供了创建、启动、停止和删除Windows服务的功能。下面是一个使用示例:
首先,需要安装pywin32包。可以通过运行以下命令来安装它:
pip install pywin32
接下来,创建一个Python脚本,命名为myservice.py,并导入必要的模块:
import win32serviceutil
import win32service
import win32event
import servicemanager
import socket
import os
import sys
import traceback
import logging
# 定义服务类
class MyService(win32serviceutil.ServiceFramework):
_svc_name_ = 'MyService'
_svc_display_name_ = 'My Service'
# 构造函数
def __init__(self, args):
win32serviceutil.ServiceFramework.__init__(self, args)
self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
socket.setdefaulttimeout(60)
self.is_alive = True
# 启动服务
def SvcDoRun(self):
servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
servicemanager.PYS_SERVICE_STARTED,
(self._svc_name_, ''))
self.main()
# 停止服务
def SvcStop(self):
servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
servicemanager.PYS_SERVICE_STOPPED,
(self._svc_name_, ''))
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
win32event.SetEvent(self.hWaitStop)
self.is_alive = False
# 主要功能
def main(self):
try:
# 在这里写下你的服务主要功能
# 例如,这里可以写下一段循环,每隔一段时间打印一次日志
while self.is_alive:
logging.info('Service is running...')
# 具体功能的代码可以在这里编写
win32event.WaitForSingleObject(self.hWaitStop, 5000) # 等待停止信号,每隔5秒检查一次
except Exception:
# 发生异常时记录日志
logging.error(traceback.format_exc())
sys.exit(-1)
if __name__ == '__main__':
if len(sys.argv) == 1:
servicemanager.Initialize()
servicemanager.PrepareToHostSingle(MyService)
servicemanager.StartServiceCtrlDispatcher()
else:
win32serviceutil.HandleCommandLine(MyService)
上面的代码定义了一个名为MyService的服务类,它继承自win32serviceutil.ServiceFramework。在该类中,重写了SvcDoRun方法和SvcStop方法,分别用于启动和停止服务。main方法中的代码是服务的主要功能,你可以在这里编写你的特定代码逻辑。
要安装该服务,打开命令提示符并切换到脚本所在的目录,然后运行以下命令:
python myservice.py install
该命令将安装服务。接下来,可以使用以下命令启动服务:
python myservice.py start
要停止服务,可以使用以下命令:
python myservice.py stop
要卸载服务,可以使用以下命令:
python myservice.py remove
这是一个简单的示例,你可以根据自己的需求来修改和扩展代码。注意,在运行服务时,你需要以管理员身份运行命令提示符。
这就是使用win32service模块创建Windows服务的示例。希望对你有所帮助!
