欢迎访问宙启技术站
智能推送

win32service:在Python中实现Windows服务

发布时间:2023-12-24 11:00:28

在Python中实现Windows服务,可以使用win32service模块。该模块提供了创建、启动、停止和删除Windows服务的功能。

首先,需要安装pywin32模块,可以使用以下命令进行安装:

pip install pywin32

下面是一个简单的示例,演示如何使用win32service模块创建一个Windows服务,服务的作用是每隔一秒输出当前时间到日志文件中:

import win32serviceutil
import win32service
import win32event
import servicemanager
import socket
import datetime
import os

class MyService(win32serviceutil.ServiceFramework):
    _svc_name_ = 'MyService'
    _svc_display_name_ = 'My Service'

    def __init__(self, args):
        win32serviceutil.ServiceFramework.__init__(self, args)
        self.is_running = True
        self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
        socket.setdefaulttimeout(60)
        self.log_file_path = 'C:\\Temp\\service.log'

    def SvcStop(self):
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        win32event.SetEvent(self.hWaitStop)
        self.is_running = False

    def SvcDoRun(self):
        servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
                              servicemanager.PYS_SERVICE_STARTED,
                              (self._svc_name_, ''))
        self.main()

    def main(self):
        while self.is_running:
            current_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
            with open(self.log_file_path, 'a') as log_file:
                log_file.write(f'{current_time}
')
            win32event.WaitForSingleObject(self.hWaitStop, 1000)

if __name__ == '__main__':
    win32serviceutil.HandleCommandLine(MyService)

在上面的代码中,MyService继承自win32serviceutil.ServiceFramework,并实现了MyService.SvcDoRun()MyService.SvcStop()方法,分别用于执行服务的主要逻辑和服务的停止逻辑。

MyService.SvcDoRun()方法中,使用servicemanager.LogMsg()输出服务已启动的日志信息,然后进入了一个无限循环,每秒钟输出当前时间到日志文件中。使用win32event.WaitForSingleObject()方法,并传入self.hWaitStop参数,使得服务可以随时响应停止命令。

MyService.SvcStop()方法中,调用win32event.SetEvent()方法设置self.hWaitStop事件对象,标志服务需要停止。

最后,通过win32serviceutil.HandleCommandLine()方法,将MyService类的处理逻辑与命令行参数绑定,即命令行中执行的命令将被传递给MyService类。

要安装该服务,打开命令提示符并使用管理员权限运行以下命令:

python <脚本文件路径> install

要启动服务,使用以下命令:

python <脚本文件路径> start

要停止服务,使用以下命令:

python <脚本文件路径> stop

要删除服务,使用以下命令:

python <脚本文件路径> remove

通过以上步骤,就可以在Windows中创建一个简单的服务,该服务每隔一秒输出当前时间到日志文件中。你可以根据自己的需求进行修改和扩展。