文章

Python pywin32 实现 windows 服务

要在 Windows 上创建一个 Python 服务,可以使用 pywin32 库。以下是一个简单的示例,说明如何创建和安装一个 Windows 服务。

安装 pywin32

首先,需要安装 pywin32 库。如果还没有安装,可以使用以下命令:

1
pip install pywin32

创建 Windows 服务

以下是一个简单的示例,展示如何创建一个基本的 Windows 服务。该服务将每隔10秒钟写一条消息到日志文件。

  1. 创建 Python 服务脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import time
import win32serviceutil
import win32service
import win32event
import servicemanager

class MyService(win32serviceutil.ServiceFramework):
    _svc_name_ = "MyService"
    _svc_display_name_ = "My Python Service"
    _svc_description_ = "This is a Python service example."

    def __init__(self, args):
        win32serviceutil.ServiceFramework.__init__(self, args)
        self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
        self.stop_requested = False

    def SvcStop(self):
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        win32event.SetEvent(self.hWaitStop)
        self.stop_requested = True

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

    def main(self):
        while not self.stop_requested:
            with open("C:\\service_log.txt", "a") as f:
                f.write("Service is running...\n")
            time.sleep(10)

if __name__ == '__main__':
    if len(sys.argv) == 1:
        servicemanager.Initialize()
        servicemanager.PrepareToHostSingle(TestService)
        servicemanager.StartServiceCtrlDispatcher()
    else:
        win32serviceutil.HandleCommandLine(TestService)
  1. 安装服务

使用以下命令安装服务:

1
python your_service_script.py install
  1. 启动服务

安装完成后,可以使用以下命令启动服务:

1
python your_service_script.py start
  1. 停止服务

可以使用以下命令停止服务:

1
python your_service_script.py stop
  1. 卸载服务

如果不再需要服务,可以使用以下命令卸载服务:

1
python your_service_script.py remove

运行服务

完成以上步骤后,服务将会运行并每隔10秒钟写一条消息到 C:\\service_log.txt 文件。你可以通过修改 main 方法来实现更复杂的逻辑。

打包服务

使用pyinstaller 可以打包服务

安装 pyinstaller

1
pip install pyinstaller 

pyinstaller常用命令

1
2
3
-F --onefile  打包成一个文件
--hiddenimport <packagename> 隐式导入,导入代码中没有使用,但隐式依赖的包
--noconsole 不显示控制台

打包服务

1
pyinstaller --onefile --hiddenimport win32timezone main.py

使用服务

1
2
3
4
main.exe install 
main.exe --startup=auto start # 可以设置启动方式为自动启动
main.exe stop
main.exe remove

使用bat 脚本来更新、启动服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@echo off
NET SESSION >nul 2>&1
IF %ERRORLEVEL% EQU 0 (
    goto :ADMIN
) ELSE (
    echo request admin permission...
    powershell -Command "Start-Process '%~dpnx0' -Verb RunAs"
    exit /b
)

:ADMIN
echo Administrator rights have been obtained, and the operation is started....

set "EXENAME=Excel_to_Csv_Service.exe"
set "EXEPATH=%~dp0%EXENAME%"

taskkill /F /IM "%EXENAME%"
%EXEPATH% stop
%EXEPATH% remove
%EXEPATH% --startup=auto install
%EXEPATH% start
echo Service installed and started successfully.
pause

本文由作者按照 CC BY 4.0 进行授权