Windows — 极其完整的:开机 / 启动时自动运行多个 Python 脚本(详细逐步教程)


Windows — 极其完整 的:开机 / 启动时自动运行多个 Python 脚本(详细逐步教程)

下面是一份「从零到可运行、包含多种方案、含所有脚本/命令/注意点」的详细指南。按你需要的场景选择或同时使用:

  • A. 开机(系统启动)就运行(登录前可后台运行) → 用 Windows Service(推荐 nssm)
  • B. 用户登录后立即运行并可见窗口(前台) → 用 任务计划程序 + .bat / VBS
  • C. 混合(服务后台 + 登录后弹出窗口) → 同时配置 A + B

我会用你之前给出的示例路径(你可以直接复制/替换):

Python (conda env) : D:\ProgramData\anaconda3\envs\csyh\python.exe
脚本目录           : D:\opcua\csyh
脚本文件           : OPCUA_1R_A.py OPCUA_1R.py OPCUA_2R_A.py OPCUA_2R.py OPCUA_KP_A.py OPCUA_KP.py

0. 先决准备(必做)

  1. 确认 Python 路径正确(在命令提示符中):

    where "D:\ProgramData\anaconda3\envs\csyh\python.exe"

    如果路径不存在,改为你系统上的真实绝对路径。

  2. 确认脚本能在命令行单独正常运行:

    "D:\ProgramData\anaconda3\envs\csyh\python.exe" "D:\opcua\csyh\OPCUA_1R_A.py"
  3. D:\opcua\csyh 下创建一个 logs 文件夹:用于写入日志(服务模式强烈建议)。

    mkdir D:\opcua\csyh\logs
  4. 为所有脚本前加日志输出(示例,放在每个 .py 的最前面):

    # 放在每个脚本最开头(示例)
    import os, sys, datetime
    logdir = r"D:\opcua\csyh\logs"
    os.makedirs(logdir, exist_ok=True)
    logfile = os.path.join(logdir, os.path.basename(__file__) + ".log")
    sys.stdout = open(logfile, "a", encoding="utf-8")
    sys.stderr = sys.stdout
    print(f"\n[{datetime.datetime.now().isoformat()}] SCRIPT STARTED")

A. 开机立即运行(登录前)——使用 Windows 服务(nssm)

优点:电脑上电 / 系统启动后就运行;不依赖用户登录;适合守护进程。
缺点:系统服务不能显示 GUI / 控制台窗口到用户桌面(安全限制)。

A.1 下载并安装 nssm(Non-Sucking Service Manager)

  • 下载后把 nssm.exe(64-bit 对应)复制到 C:\Windows\System32\(管理员权限)。
  • 确认在管理员 cmd 可以运行 nssm

A.2 注册服务(为每个脚本建服务)

管理员 身份打开命令提示符(右键“以管理员身份运行”),然后对每个脚本运行:

示例(为 OPCUA_1R_A.py 注册):

nssm install OPCUA_1R_A

会弹出 GUI 输入框,填写:

  • Path: D:\ProgramData\anaconda3\envs\csyh\python.exe
  • Startup directory: D:\opcua\csyh
  • Arguments: D:\opcua\csyh\OPCUA_1R_A.py

(按 Install service 保存)

对其他脚本重复(用不同服务名,如 OPCUA_1R 等)。

A.3 设置自动启动(开机自动)

在管理员 cmd 中运行:

sc config OPCUA_1R_A start= auto
sc config OPCUA_1R start= auto
sc config OPCUA_2R_A start= auto
sc config OPCUA_2R start= auto
sc config OPCUA_KP_A start= auto
sc config OPCUA_KP start= auto

A.4 启动 / 停止 / 查看服务状态

启动某服务:

net start OPCUA_1R_A

停止:

net stop OPCUA_1R_A

查看服务状态:

sc query OPCUA_1R_A

A.5 日志与调试

  • 因为服务没有窗口,检查 D:\opcua\csyh\logs\OPCUA_1R_A.py.log(参考上面 Python 日志写法)。
  • 若想捕获更多输出,在 nssm 的 I/O 页可以配置 Stdout/Err 重定向文件。

B. 用户登录后自动弹出窗口(可见)——任务计划程序 + .bat / VBS

目标:用户一登录后立刻看到控制台窗口或 GUI(比如你想观察输出)。

关键点:若想显示窗口,计划任务应以当前用户会话运行(选择“仅当用户登录时运行”),并不要勾选“以最高权限运行”(勾选会把任务放到 session 0,有时不显示前台)。

B.1 在脚本目录下创建 run_all.bat

路径:D:\opcua\csyh\run_all.bat,内容(详尽版:含延时、工作目录、窗口标题):

@echo off
title OPCUA 启动脚本总控
REM 延时等待桌面完全加载(必要时调整秒数)
timeout /t 10 >nul

REM 切换到脚本目录
cd /d "D:\opcua\csyh"

REM 逐个启动并让窗口最大化显示(每个窗口标题有区分)
start "OPCUA_1R_A" cmd /k "D:\ProgramData\anaconda3\envs\csyh\python.exe D:\opcua\csyh\OPCUA_1R_A.py"
start "OPCUA_1R"   cmd /k "D:\ProgramData\anaconda3\envs\csyh\python.exe D:\opcua\csyh\OPCUA_1R.py"
start "OPCUA_2R_A" cmd /k "D:\ProgramData\anaconda3\envs\csyh\python.exe D:\opcua\csyh\OPCUA_2R_A.py"
start "OPCUA_2R"   cmd /k "D:\ProgramData\anaconda3\envs\csyh\python.exe D:\opcua\csyh\OPCUA_2R.py"
start "OPCUA_KP_A" cmd /k "D:\ProgramData\anaconda3\envs\csyh\python.exe D:\opcua\csyh\OPCUA_KP_A.py"
start "OPCUA_KP"   cmd /k "D:\ProgramData\anaconda3\envs\csyh\python.exe D:\opcua\csyh\OPCUA_KP.py"

REM 可选:暂停以防窗口马上关闭(仅当脚本本身结束时需要)
REM pause
exit

说明:

  • start "title" cmd /k "python ...":用 cmd 打开并保持窗口(不立即关闭)。
  • timeout /t 10:建议延时 10 秒,可根据机器速度调整。

B.2 (可选)用 VBS 强制置顶窗口(如果需要)

创建 D:\opcua\csyh\bring_front.vbs 用于启动并激活窗口:

Set WshShell = CreateObject("WScript.Shell")
WshShell.Run "D:\opcua\csyh\run_all.bat", 1, False  ' 1 = normale window
WScript.Sleep 2000  ' 等 2 秒让窗口出现
' 激活各个窗口(按窗口标题)
On Error Resume Next
WshShell.AppActivate "OPCUA_1R_A"
WScript.Sleep 500
WshShell.AppActivate "OPCUA_1R"
WScript.Sleep 500
WshShell.AppActivate "OPCUA_2R_A"
' 根据需要继续 AppActivate

注意:AppActivate 用标题匹配窗口标题(上面 start "OPCUA_1R_A" 的标题)——若匹配失败,可使用更精确的标题或程序名。

B.3 在“任务计划程序”中创建任务(非常详细步骤)

  1. 打开Win + R → 输入 taskschd.msc → 回车。

  2. 右侧 点击:**创建任务…**(不是“创建基本任务”)。

  3. 常规(General)选项卡

    • 名称:OPCUA Login Launch
    • 描述:登录后启动 OPCUA 脚本(任选)
    • 安全选项:选择你的用户账户(默认你的当前用户)。
    • 选择仅当用户登录时运行(非常关键,保证窗口可见)。
    • 不要勾选以最高权限运行(否则可能在 session 0,不显示)
    • 配置为:Windows 10/11。
  4. 触发器(Triggers) → 新建(New…):

    • 开始任务:At log on(登录时)
    • 用户:Any user 或指定用户
    • 高级设置:延迟任务执行:10 秒(建议)
    • 点击 确定。
  5. 操作(Actions) → 新建(New…):

    • 操作:Start a program

    • 程序或脚本(Program/script):cmd.exe

    • 添加参数(Add arguments):

      /c "D:\opcua\csyh\run_all.bat"

      (使用 /c 会运行并关闭 cmd;如果你想保留 master 窗口也可以直接填写 bat 路径,但用 cmd /c 更可靠用于显示)

    • 起始于(Start in):D:\opcua\csyh

    • 确定。

  6. 条件(Conditions):取消不必要限制,如“仅在使用交流电时”等。

  7. 设置(Settings):勾选“如果任务失败,重试”等按需设置。

  8. 保存 → 系统可能提示输入你的用户密码(任务需要凭据)。

  9. 测试:右键任务 → 运行,应该立即在桌面看到多个窗口弹出。

B.4 验证

  • 退出当前账户并重新登录或重启并登录,等待大约 10 秒,观察窗口是否自动弹出。
  • 若没有弹出,检查任务历史(在任务上右键 -> 查看历史)和 run_all.bat 是否有错误输出。

C. 混合方案(推荐:服务 + 登录前台显示)

  1. nssm 把关键后端脚本注册为服务(A),保证开机就运行后台任务
  2. 任务计划程序 在用户登录时运行 run_all.bat(B),弹出前台窗口(用于可视/监控)。
  3. 两边脚本应设计为幂等或在启动时检测已有进程(避免重复运行)。
    • 在 Python 脚本中可以用 PID 文件或端口占用检测来避免重复启动。

示例(检测端口的简单做法):

import socket, sys
def is_port_in_use(port=12345):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        s.bind(('127.0.0.1', port))
    except Exception:
        return True
    finally:
        s.close()
    return False
if is_port_in_use(5000):
    print("Another instance running, exit.")
    sys.exit(0)

D. 备用方法(注册表、Startup folder)简要说明

  • Startup foldershell:startup): 把 .bat 或快捷方式放进去,用户登录后会运行(等同于 B 的 simpler 版本)。
  • 注册表HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run 可添加启动项(专业但不推荐用于复杂脚本)。
    这些方法都需要用户登录才能显示前台。

E. 常见问题与排错清单(贴心逐项)

  1. 脚本运行但看不到任何输出

    • 检查是否为服务(服务不会显示窗口)。
    • 检查日志文件 D:\opcua\csyh\logs\*.log
  2. 计划任务运行但窗口不显示

    • 确保任务“仅当用户登录时运行”。
    • 确保没有勾选“以最高权限运行”或如果勾选了用 VBS/AppActivate激活窗口。
    • 确保“操作”使用 cmd.exe /c "path\to\run_all.bat" 并设置正确的 “起始于” 路径。
  3. “操作目录无效”错误

    • 在 .bat 中使用 cd /d "D:\opcua\csyh" 或 在任务的 “起始于” 填写目录。
  4. 脚本重复启动

    • 服务 + 登录脚本同时启动同一脚本会重复。用端口或 PID 文件防重复。
  5. 权限 / 环境变量问题(conda 环境)

    • 如果脚本依赖 conda 环境包,建议使用环境中 python.exe 的绝对路径,或在 .bat 中先激活环境(复杂),例如:

      call "D:\ProgramData\anaconda3\Scripts\activate.bat" csyh
      python D:\opcua\csyh\OPCUA_1R_A.py
    • 注意:在服务下激活 conda 有时会失败,直接使用 env 的 python.exe 更稳。

  6. 启动顺序 / 依赖(网络/盘未挂载)

    • 如果脚本依赖网络驱动器或云盘,同步尚未完成可能失败。为计划任务设置延迟(30s 或更长),或在脚本中重试逻辑。

F. 最终「一键部署」文件清单(建议你把这些文件放到 D:\opcua\csyh

  1. run_all.bat(前文给出)
  2. bring_front.vbs(可选,用于激活窗口)
  3. startup_opcua_service_setup.cmd(管理员运行,一次性注册服务的模板脚本)——示例内容
@echo off
REM ---- 请以管理员身份运行此脚本,需事先把 nssm.exe 放到 C:\Windows\System32 ----

nssm install OPCUA_1R_A "D:\ProgramData\anaconda3\envs\csyh\python.exe" "D:\opcua\csyh\OPCUA_1R_A.py"
nssm install OPCUA_1R   "D:\ProgramData\anaconda3\envs\csyh\python.exe" "D:\opcua\csyh\OPCUA_1R.py"
nssm install OPCUA_2R_A "D:\ProgramData\anaconda3\envs\csyh\python.exe" "D:\opcua\csyh\OPCUA_2R_A.py"
nssm install OPCUA_2R   "D:\ProgramData\anaconda3\envs\csyh\python.exe" "D:\opcua\csyh\OPCUA_2R.py"
nssm install OPCUA_KP_A "D:\ProgramData\anaconda3\envs\csyh\python.exe" "D:\opcua\csyh\OPCUA_KP_A.py"
nssm install OPCUA_KP   "D:\ProgramData\anaconda3\envs\csyh\python.exe" "D:\opcua\csyh\OPCUA_KP.py"

sc config OPCUA_1R_A start= auto
sc config OPCUA_1R start= auto
sc config OPCUA_2R_A start= auto
sc config OPCUA_2R start= auto
sc config OPCUA_KP_A start= auto
sc config OPCUA_KP start= auto

echo Services created. You can start them via: net start OPCUA_1R_A
pause

注意:上面 nssm install <name> <path> <args> 的命令行语法在部分 nssm 版本上可能需要打开 GUI 填写。若命令行无效,请直接运行 nssm install <name> 用 GUI 填值。


G. 推荐顺序(快速部署建议)

  1. 在本地命令行测试每个脚本能否正常运行并写日志。
  2. 若需要“开机就运行(登录前)”,先用 nssm 注册服务(A)。测试并查看日志。
  3. 若需要“登录后可见”,再设置任务计划程序运行 run_all.bat(B)。测试并确认窗口弹出。
  4. 最后优化:延时、错误重试、日志轮转、避免重复启动。

文章作者: 0xdadream
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 0xdadream !
评论
  目录