杰瑞科技汇

Python程序如何在Windows后台运行?

在 Windows 系统中让 Python 脚本在后台运行,有多种方法,适用于不同的场景(如开发、测试、生产环境),下面我将从最简单到最专业、最稳定的方式,为你详细介绍。


命令行重定向(简单、临时)

这是最基础的方法,适用于临时测试,将命令行窗口隐藏起来。

原理:使用 start 命令的 BMIN 参数来启动一个新窗口,并立即返回。

最简单的隐藏窗口运行

打开 cmdPowerShell,输入以下命令:

start /B python your_script.py
  • start: Windows 命令,用于启动一个新程序。
  • /B: 表示在新窗口中启动应用程序,但不创建新的命令行窗口。这是实现后台运行的关键
  • python your_script.py: 你要执行的命令。

缺点

  • 如果用户注销或电脑重启,脚本会立即停止。
  • 没有日志输出,难以调试。
  • 如果脚本需要长时间运行,cmd 窗口不能关闭。

使用 Python 库(推荐用于开发测试)

有一些第三方库可以方便地将 Python 脚本封装成一个后台服务或守护进程。

python-daemon

这是一个功能强大的库,它遵循 Unix 守护进程的规范,可以很好地在 Windows 上工作。

安装:

pip install python-daemon

示例代码 (your_script.py):

import time
import daemon
import logging
# 配置日志,这样你就能看到脚本在后台做了什么
logging.basicConfig(
    filename='my_app.log',
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s'
)
def main():
    logging.info("后台脚本启动中...")
    try:
        while True:
            logging.info("脚本正在运行...")
            time.sleep(5)  # 每5秒记录一次日志
    except Exception as e:
        logging.error(f"脚本发生错误: {e}")
if __name__ == "__main__":
    # 使用 daemon.DaemonContext 创建一个守护进程上下文
    # files_preserve 用于保持日志文件在后台运行时仍然可写
    with daemon.DaemonContext(
        files_preserve=[logging.getLogger().handlers[0].stream]
    ):
        main()

如何运行: 在 cmd 或 PowerShell 中直接运行 Python 脚本即可,它会自动进入后台。

python your_script.py

如何停止: 这个方法本身不提供停止机制,你需要手动结束进程。

  1. 打开 任务管理器 (Ctrl + Shift + Esc)。
  2. 切换到 “详细信息”“进程” 标签页。
  3. 找到 python.exe 进程,并结束它。

优点

  • 代码逻辑清晰,易于管理。
  • 支持日志记录,方便调试。
  • 脚本与操作系统解耦,关闭终端窗口不会影响脚本运行。

缺点

  • 停止脚本需要手动结束进程,不够优雅。

使用 nohup 命令(类 Unix 风格)

nohup (no hang up) 是一个 Unix/Linux 命令,用于让命令在用户注销后仍然继续运行,在 Windows 10/11 中,可以通过 Windows Subsystem for Linux (WSL) 来使用它。

前提条件:

  • 已安装 WSL。
  • 已在 WSL 中安装 Python。

如何运行:

  1. 打开 WSL 终端 (Ubuntu)。
  2. 运行以下命令:
nohup python your_script.py > output.log 2>&1 &
  • nohup: 忽略挂断信号,使得脚本在关闭终端后也能继续运行。
  • > output.log: 将标准输出重定向到 output.log 文件。
  • 2>&1: 将标准错误 也重定向到标准输出,也就是 output.log 文件。
  • &: 在后台运行该命令。

优点

  • 脚本在用户注销甚至 WSL 终端关闭后仍会持续运行。
  • 日志会保存在文件中,方便查看。

缺点

  • 依赖于 WSL 环境,不是纯 Windows 方案。
  • 停止脚本同样需要手动在 WSL 中找到并杀死进程 (ps aux | grep python, kill <pid>)。

使用 Windows 服务(专业、稳定、推荐用于生产环境)

这是在 Windows 上实现后台运行最专业、最稳定的方式,它将你的 Python 脚本注册为系统服务,具有以下优点:

  • 自动启动:可以在系统启动时自动运行。
  • 自动重启:如果服务崩溃,Windows 可以自动重启它。
  • 权限管理:可以配置以特定用户身份运行。
  • 易于管理:可以通过 services.msc 进行启动、停止、配置等操作。

推荐工具:pywin32

pywin32 是一个 Python 库,它提供了对 Windows API 的访问,包括创建和管理服务。

安装:

pip install pywin32

示例代码 (your_service.py):

import win32serviceutil
import win32service
import win32event
import servicemanager
import socket
import time
import logging
# 配置日志
logging.basicConfig(filename='service.log', level=logging.INFO, format='%(asctime)s - %(message)s')
class AppServerSvc(win32serviceutil.ServiceFramework):
    _svc_name_ = "MyPythonService"  # 服务名称
    _svc_display_name_ = "My Awesome Python Service" # 服务显示名称
    _svc_description_ = "这是一个用Python编写的Windows示例服务。"
    def __init__(self, args):
        win32serviceutil.ServiceFramework.__init__(self, args)
        self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
        self.isrunning = False
        # 为了方便调试,可以在这里添加日志
        servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
                              servicemanager.PYS_SERVICE_STARTED,
                              (self._svc_name_, ''))
    def SvcStop(self):
        # 告诉 SCM 我们正在停止
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        self.isrunning = False
        # 设置事件
        win32event.SetEvent(self.hWaitStop)
        servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
                              servicemanager.PYS_SERVICE_STOPPED,
                              (self._svc_name_, ''))
    def SvcDoRun(self):
        self.isrunning = True
        servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
                              servicemanager.PYS_SERVICE_STARTED,
                              (self._svc_name_, ''))
        # --- 在这里编写你的主程序逻辑 ---
        try:
            while self.isrunning:
                logging.info("服务正在运行...")
                # 这里可以放你的主要任务,例如一个循环
                time.sleep(5)
        except Exception as e:
            logging.error(f"服务发生致命错误: {e}")
            # 发生错误时,停止服务
            self.SvcStop()
            # 将错误报告给 SCM
            servicemanager.LogErrorMsg(f"服务 {self._svc_name_} 停止,因为发生错误: {e}")
if __name__ == '__main__':
    win32serviceutil.HandleCommandLine(AppServerSvc)

如何安装和运行服务:

  1. 以管理员身份打开 cmdPowerShell,这是必须的,因为安装服务需要管理员权限。

  2. 安装服务:

    python your_service.py install

    执行后,你可以在服务管理器 (services.msc) 中找到 "MyPythonService"。

  3. 启动服务:

    • 方法一 (命令行):
      python your_service.py start
    • 方法二 (图形界面): 按 Win + R,输入 services.msc,找到 "MyPythonService",右键点击 -> "启动"。
  4. 停止服务:

    • 方法一 (命令行):
      python your_service.py stop
    • 方法二 (图形界面): 在 services.msc 中找到服务,右键点击 -> "停止"。
  5. 卸载服务: 当不再需要服务时,以管理员身份运行:

    python your_service.py remove

优点

  • 最稳定、最专业的方式。
  • 集成到操作系统生命周期中,支持自动启动、恢复等。
  • 适合长期运行的关键任务。

缺点

  • 设置相对复杂。
  • 调试比普通脚本困难,需要依赖日志文件。
  • 需要管理员权限。

总结与选择建议

方法 优点 缺点 适用场景
命令行重定向 (start /B) 简单快捷,无需额外库 不稳定,注销/重启即停,无日志 临时测试、快速验证
python-daemon 代码封装好,支持日志 停止需手动结束进程 开发、测试阶段,需要后台运行但非关键任务
nohup (WSL) 类 Unix 习惯,日志持久 依赖 WSL,非纯 Windows 已在 WSL 环境下工作的开发者
Windows 服务 最稳定,自动启动/重启,权限管理 设置复杂,调试困难,需管理员权限 生产环境、关键业务、需要长期稳定运行的系统服务

给你的建议

  • 如果你只是想临时运行一下脚本,不想看到那个黑窗口:使用 start /B python your_script.py
  • 如果你在开发或测试阶段,需要一个稳定后台环境,但不想搞得太复杂:使用 python-daemon 库。
  • 如果你的脚本需要在服务器上 7x24 小时不间断运行,并且你希望它像其他系统服务一样可靠强烈推荐使用 Windows 服务,这是最规范、最值得信赖的方案。
分享:
扫描分享到社交APP
上一篇
下一篇