python 脚本改写成Windows 服务

将 Python 脚本转化为 Windows 服务(Service)可实现后台自启动、无需用户登录运行,并通过系统服务管理器统一管理。以下是两种主流方法的详细步骤和注意事项:

⚙️ 一、方法一:使用 NSSM(推荐,无需改代码)

NSSM(Non-Sucking Service Manager)是第三方工具,可将任意可执行文件包装为服务,适合快速部署且无需修改原有脚本。
操作流程:

  1. 下载 NSSM
    访问 https://nssm.cc/download,解压后将 nssm.exe 放入系统路径(如 C:\Windows)或脚本目录。

  2. 安装服务
    以管理员身份运行命令提示符,执行:
    nssm install “你的服务名” “Python解释器路径” “脚本路径”

    示例:
    nssm install MyPythonService C:\Python39\python.exe D:\app\main.py

    • 弹出配置窗口可设置服务描述、启动类型(自动/手动)等。

  3. 管理服务
    • 启动:nssm start MyPythonService 或 net start MyPythonService

    • 停止:nssm stop MyPythonService

    • 卸载:nssm remove MyPythonService

✅ 优势

• 无需修改 Python 代码,适合现有脚本快速服务化。

• 支持日志重定向、环境变量配置等高级设置。

🧩 二、方法二:使用 pywin32(代码级集成)

通过 pywin32 库将脚本嵌入 Windows 服务框架,需编写服务控制逻辑。
操作流程:

  1. 安装依赖
    pip install pywin32

    验证安装:python -c “import win32service” 无报错即成功。

  2. 编写服务框架代码
    创建新文件(如 service_wrapper.py),参考以下模板:
    import win32serviceutil
    import win32service
    import win32event
    import servicemanager
    import time

    class 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 = False
    

    if name == ‘main’:
    win32serviceutil.HandleCommandLine(MyService)

    • 将 SvcDoRun() 中的循环逻辑替换为你的脚本主函数。

  3. 安装与管理服务
    • 安装:python service_wrapper.py install

    • 启动:python service_wrapper.py start

    • 停止:python service_wrapper.py stop

    • 卸载:python service_wrapper.py remove

✅ 优势

• 深度控制服务行为(如暂停、恢复)。

• 适合需与服务生命周期绑定的复杂逻辑(如资源清理)。

⚠️ 三、关键注意事项

  1. 权限问题
    • 安装/卸载服务需管理员权限,否则提示“拒绝访问”。

    • 服务默认以 SYSTEM 账户运行,若需访问用户资源(如网络驱动器),需在服务属性中配置登录账户。

  2. 日志记录
    • 避免直接使用 print(),服务运行时无控制台。建议用 logging 模块输出到文件:
    import logging
    logging.basicConfig(filename=‘C:\logs\service.log’, level=logging.INFO)

  3. 环境问题
    • 打包为 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+ 验证。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值