Python pywin32 实现 windows 服务
要在 Windows 上创建一个 Python 服务,可以使用 pywin32 库。以下是一个简单的示例,说明如何创建和安装一个 Windows 服务。
安装 pywin32
首先,需要安装 pywin32 库。如果还没有安装,可以使用以下命令:
1
pip install pywin32
创建 Windows 服务
以下是一个简单的示例,展示如何创建一个基本的 Windows 服务。该服务将每隔10秒钟写一条消息到日志文件。
- 创建 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
python your_service_script.py install
- 启动服务
安装完成后,可以使用以下命令启动服务:
1
python your_service_script.py start
- 停止服务
可以使用以下命令停止服务:
1
python your_service_script.py stop
- 卸载服务
如果不再需要服务,可以使用以下命令卸载服务:
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 进行授权