将 Python 脚本转化为 Windows 服务(Service)可实现后台自启动、无需用户登录运行,并通过系统服务管理器统一管理。以下是两种主流方法的详细步骤和注意事项:
⚙️ 一、方法一:使用 NSSM(推荐,无需改代码)
NSSM(Non-Sucking Service Manager)是第三方工具,可将任意可执行文件包装为服务,适合快速部署且无需修改原有脚本。
操作流程:
-
下载 NSSM
访问 https://nssm.cc/download,解压后将 nssm.exe 放入系统路径(如 C:\Windows)或脚本目录。 -
安装服务
以管理员身份运行命令提示符,执行:
nssm install “你的服务名” “Python解释器路径” “脚本路径”示例:
nssm install MyPythonService C:\Python39\python.exe D:\app\main.py• 弹出配置窗口可设置服务描述、启动类型(自动/手动)等。
-
管理服务
• 启动:nssm start MyPythonService 或 net start MyPythonService• 停止:nssm stop MyPythonService
• 卸载:nssm remove MyPythonService
✅ 优势
• 无需修改 Python 代码,适合现有脚本快速服务化。
• 支持日志重定向、环境变量配置等高级设置。
🧩 二、方法二:使用 pywin32(代码级集成)
通过 pywin32 库将脚本嵌入 Windows 服务框架,需编写服务控制逻辑。
操作流程:
-
安装依赖
pip install pywin32验证安装:python -c “import win32service” 无报错即成功。
-
编写服务框架代码
创建新文件(如 service_wrapper.py),参考以下模板:
import win32serviceutil
import win32service
import win32event
import servicemanager
import timeclass MyService(win32serviceutil.ServiceFramework):
svc_name = “MyPythonService” # 服务内部名称
svc_display_name = “My服务” # 显示名称
svc_description = “自定义Python服务” # 描述def __init__(self, args): super().__init__(args) self.hWaitStop = win32event.CreateEvent(None, 0, 0, None) self.is_running = True def SvcDoRun(self): # 服务主逻辑(替换为你的脚本入口) while self.is_running: with open("C:\\logs\\service.log", "a") as f: f.write("服务运行中...\n") time.sleep(10) def SvcStop(self): self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) win32event.SetEvent(self.hWaitStop) self.is_running = Falseif name == ‘main’:
win32serviceutil.HandleCommandLine(MyService)• 将 SvcDoRun() 中的循环逻辑替换为你的脚本主函数。
-
安装与管理服务
• 安装:python service_wrapper.py install• 启动:python service_wrapper.py start
• 停止:python service_wrapper.py stop
• 卸载:python service_wrapper.py remove
✅ 优势
• 深度控制服务行为(如暂停、恢复)。
• 适合需与服务生命周期绑定的复杂逻辑(如资源清理)。
⚠️ 三、关键注意事项
-
权限问题
• 安装/卸载服务需管理员权限,否则提示“拒绝访问”。• 服务默认以 SYSTEM 账户运行,若需访问用户资源(如网络驱动器),需在服务属性中配置登录账户。
-
日志记录
• 避免直接使用 print(),服务运行时无控制台。建议用 logging 模块输出到文件:
import logging
logging.basicConfig(filename=‘C:\logs\service.log’, level=logging.INFO) -
环境问题
• 打包为 EXE 时(如用 PyInstaller),确保依赖库和路径正确。测试命令:
sc create MyService binPath=“C:\dist\your_service.exe”
🔧 四、故障排查
问题现象 解决方案
服务启动超时(The service did not respond…) 检查 SvcDoRun() 是否阻塞主线程;或注册缺失的 DLL:
复制 pywin32_system32 下的 pywintypesXX.dll 到 win32 目录。
导入模块失败(ImportError: DLL not found) 确保 Python 与 pywin32 版本匹配(如 Python 3.10 需 pywin32 > 305)。
服务无法写入文件/网络 检查路径权限(如 C:\logs 需赋予 SYSTEM 写入权限)。
💎 总结
• 快速部署 → 选 NSSM,5 分钟内完成,不改代码。
• 深度控制 → 用 pywin32,适合需精细管理启动/停止逻辑的服务。
• 生产环境务必添加日志和异常捕获,避免服务静默失败。两种方法均已在 Windows Server 2016+/Windows 10+ 验证。
846

被折叠的 条评论
为什么被折叠?



