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. 先决准备(必做)
确认 Python 路径正确(在命令提示符中):
where "D:\ProgramData\anaconda3\envs\csyh\python.exe"如果路径不存在,改为你系统上的真实绝对路径。
确认脚本能在命令行单独正常运行:
"D:\ProgramData\anaconda3\envs\csyh\python.exe" "D:\opcua\csyh\OPCUA_1R_A.py"在
D:\opcua\csyh下创建一个logs文件夹:用于写入日志(服务模式强烈建议)。mkdir D:\opcua\csyh\logs为所有脚本前加日志输出(示例,放在每个 .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 在“任务计划程序”中创建任务(非常详细步骤)
打开:
Win + R→ 输入taskschd.msc→ 回车。右侧 点击:**创建任务…**(不是“创建基本任务”)。
常规(General)选项卡:
- 名称:
OPCUA Login Launch - 描述:
登录后启动 OPCUA 脚本(任选) - 安全选项:选择你的用户账户(默认你的当前用户)。
- 选择:
仅当用户登录时运行(非常关键,保证窗口可见)。 - 不要勾选:
以最高权限运行(否则可能在 session 0,不显示) - 配置为:Windows 10/11。
- 名称:
触发器(Triggers) → 新建(New…):
- 开始任务:
At log on(登录时) - 用户:
Any user或指定用户 - 高级设置:延迟任务执行:10 秒(建议)
- 点击 确定。
- 开始任务:
操作(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确定。
条件(Conditions):取消不必要限制,如“仅在使用交流电时”等。
设置(Settings):勾选“如果任务失败,重试”等按需设置。
保存 → 系统可能提示输入你的用户密码(任务需要凭据)。
测试:右键任务 → 运行,应该立即在桌面看到多个窗口弹出。
B.4 验证
- 退出当前账户并重新登录或重启并登录,等待大约 10 秒,观察窗口是否自动弹出。
- 若没有弹出,检查任务历史(在任务上右键 -> 查看历史)和
run_all.bat是否有错误输出。
C. 混合方案(推荐:服务 + 登录前台显示)
- 用 nssm 把关键后端脚本注册为服务(A),保证开机就运行后台任务。
- 用 任务计划程序 在用户登录时运行
run_all.bat(B),弹出前台窗口(用于可视/监控)。 - 两边脚本应设计为幂等或在启动时检测已有进程(避免重复运行)。
- 在 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 folder(
shell:startup): 把.bat或快捷方式放进去,用户登录后会运行(等同于 B 的 simpler 版本)。 - 注册表:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run可添加启动项(专业但不推荐用于复杂脚本)。
这些方法都需要用户登录才能显示前台。
E. 常见问题与排错清单(贴心逐项)
脚本运行但看不到任何输出
- 检查是否为服务(服务不会显示窗口)。
- 检查日志文件
D:\opcua\csyh\logs\*.log。
计划任务运行但窗口不显示
- 确保任务“仅当用户登录时运行”。
- 确保没有勾选“以最高权限运行”或如果勾选了用 VBS/
AppActivate激活窗口。 - 确保“操作”使用
cmd.exe /c "path\to\run_all.bat"并设置正确的 “起始于” 路径。
“操作目录无效”错误
- 在 .bat 中使用
cd /d "D:\opcua\csyh"或 在任务的 “起始于” 填写目录。
- 在 .bat 中使用
脚本重复启动
- 服务 + 登录脚本同时启动同一脚本会重复。用端口或 PID 文件防重复。
权限 / 环境变量问题(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更稳。
启动顺序 / 依赖(网络/盘未挂载)
- 如果脚本依赖网络驱动器或云盘,同步尚未完成可能失败。为计划任务设置延迟(30s 或更长),或在脚本中重试逻辑。
F. 最终「一键部署」文件清单(建议你把这些文件放到 D:\opcua\csyh)
run_all.bat(前文给出)bring_front.vbs(可选,用于激活窗口)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. 推荐顺序(快速部署建议)
- 在本地命令行测试每个脚本能否正常运行并写日志。
- 若需要“开机就运行(登录前)”,先用 nssm 注册服务(A)。测试并查看日志。
- 若需要“登录后可见”,再设置任务计划程序运行
run_all.bat(B)。测试并确认窗口弹出。 - 最后优化:延时、错误重试、日志轮转、避免重复启动。