如何区分Python脚本是Windows启动执行还是后续手动/脚本调用执行
区分Windows启动时与手动执行Python脚本的方法
你之前用if 'STARTUP' in os.environ:判断无效,核心原因是Windows默认不会给启动程序自动设置STARTUP环境变量,这个判断条件根本触发不了。下面是几个可行的替代方案:
方案1:通过父进程判断
Windows登录后启动的程序,父进程通常是explorer.exe(桌面进程);如果是后台服务启动的,父进程可能是services.exe。可以用psutil库获取父进程信息来区分:
- 先安装依赖库:
pip install psutil
- 示例代码:
import os import psutil def is_startup_triggered(): parent_pid = os.getppid() try: parent_process = psutil.Process(parent_pid) # 检查父进程是否为系统启动相关进程 return parent_process.name().lower() in ['explorer.exe', 'services.exe'] except (psutil.NoSuchProcess, psutil.AccessDenied): return False if __name__ == '__main__': if is_startup_triggered(): print("执行Windows启动时的专属操作") # 这里编写启动时的业务逻辑 else: print("执行手动/其他调用时的操作") # 这里编写手动执行的业务逻辑
方案2:给启动项添加自定义环境变量
给Windows启动项里的脚本绑定一个专属环境变量,脚本通过检测这个变量精准判断执行时机:
- 创建脚本的快捷方式,右键点击快捷方式→属性→目标,修改为:
cmd /c "set MY_SCRIPT_FROM_STARTUP=1 && python D:\实际路径\你的脚本.py"
(把路径替换成你的脚本真实路径)
- 脚本内的判断代码:
import os if __name__ == '__main__': if os.environ.get('MY_SCRIPT_FROM_STARTUP') == '1': print("执行Windows启动时的专属操作") # 启动时逻辑 else: print("执行手动/其他调用时的操作") # 手动执行逻辑
这个方法完全不会有误判,是最可靠的方案。
方案3:通过时间差判断(适合精度要求不高的场景)
获取系统启动时间,对比脚本启动时间的间隔,如果间隔很短(比如10分钟内),则判定为启动时执行:
import os import time import psutil def is_startup_triggered(): boot_time = psutil.boot_time() script_start_time = os.path.getctime(__file__) # 阈值设为10分钟(600秒),可根据需求调整 return (time.time() - boot_time) < 600 and (script_start_time - boot_time) < 600 if __name__ == '__main__': if is_startup_triggered(): print("执行Windows启动时的专属操作") else: print("执行手动/其他调用时的操作")
注意:如果用户在开机后阈值时间内手动执行脚本,会误判为启动触发,仅适合对精度要求低的场景。
内容的提问来源于stack exchange,提问作者user23378386
相关产品推荐
相关产品推荐

