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

win32service:在Python中实现Windows服务自动启动和关闭

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

在Python中,可以使用win32service模块来实现Windows服务的自动启动和关闭。win32service模块是PyWin32的一个组件,可以用于操作Windows服务。

首先,我们需要安装PyWin32模块。在命令行中执行以下命令进行安装:

pip install pywin32

安装完成后,我们可以编写一个Python脚本来创建和控制Windows服务。以下是一个简单的示例:

import win32serviceutil
import win32service
import win32event
import servicemanager
import socket
import os
import sys

# 创建一个Windows服务类
class MyService(win32serviceutil.ServiceFramework):
    _svc_name_ = 'MyService'  # 服务名称
    _svc_display_name_ = 'My Service'  # 服务显示名称
    _svc_description_ = 'This is a sample Windows service.'  # 服务描述

    def __init__(self, args):
        win32serviceutil.ServiceFramework.__init__(self, args)
        self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)  # 创建停止事件

    def SvcStop(self):
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)  # 停止服务
        win32event.SetEvent(self.hWaitStop)

    def SvcDoRun(self):
        servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
                              servicemanager.PYS_SERVICE_STARTED,
                              (self._svc_name_, ''))
        self.main()  # 运行服务

    def main(self):
        # 在这里编写你的服务逻辑
        while True:
            pass

# 启动或停止服务
if __name__ == '__main__':
    if len(sys.argv) == 1:
        servicemanager.Initialize()
        servicemanager.PrepareToHostSingle(MyService)
        servicemanager.StartServiceCtrlDispatcher()
    else:
        win32serviceutil.HandleCommandLine(MyService)

以上代码创建了一个自定义的Windows服务类MyService,并实现了几个重要的方法:

- \_\_init\_\_方法:初始化服务,并创建一个停止事件。

- SvcStop方法:停止服务。

- SvcDoRun方法:运行服务,其中的main方法是你可以编写自己服务的逻辑。

在main方法中,你可以编写你的服务逻辑代码,例如定时任务、网络监听等功能。

在脚本的最后,通过判断命令行参数来决定是启动服务还是停止服务。

为了将脚本部署为一个Windows服务,我们需要在命令行中以管理员权限执行以下命令:

python script.py install

其中script.py是你的脚本文件。这将会将脚本文件注册为一个Windows服务。

要启动服务,执行以下命令:

python script.py start

要停止服务,执行以下命令:

python script.py stop

要卸载服务,执行以下命令:

python script.py remove

以上就是使用win32service模块在Python中实现Windows服务自动启动和关闭的基本方法。你可以根据自己的需要编写具体的服务逻辑。