最直接方式是用os.system()调用Windows自带shutdown命令,需正确传参:关机用/shutdown /s /t 秒数/,重启用/r,取消用/a;定时推荐threading.Timer或schtasks注册计划任务。

用 os.system() 调用 shutdown 命令最直接
Windows 自带的 shutdown 命令是实现自动关机/重启最可靠的方式,Python 只需调用它即可,不需要额外依赖或管理员权限(但部分参数仍需提权)。关键不是写逻辑,而是传对参数。
常见操作对应命令:
- 关机:
shutdown /s /t 0(立即)或shutdown /s /t 300(5分钟后) - 重启:
shutdown /r /t 0 - 取消待定操作:
shutdown /a
/t 后跟秒数,必须是整数;/s 和 /r 互斥,不能同时用。如果脚本运行后没反应,大概率是没加 /t 参数——Windows 默认要求至少 30 秒延迟,不指定会报错。
定时触发得靠 sched 或 threading.Timer,别用 time.sleep() 阻塞主流程
如果只是“等 10 分钟后关机”,用 time.sleep(600); os.system("shutdown /s /t 0") 看似简单,但会卡死整个脚本,无法中途取消、无法响应其他逻辑。真实场景下推荐 sched.scheduler 或 threading.Timer。
立即学习“Python免费学习笔记(深入)”;
更轻量的做法是用 threading.Timer:
import threading
import os
<p>def shutdown_later(seconds):
timer = threading.Timer(seconds, lambda: os.system("shutdown /s /t 0"))
timer.start()
return timer # 保存引用,便于后续调用 timer.cancel()</p><h1>例如:300 秒后关机</h1><p>t = shutdown_later(300)</p><div class="aritcle_card flexRow">
<div class="artcardd flexRow">
<a class="aritcle_card_img" href="/xiazai/skill8054" title="python-parallelization"><img
src="https://img.php.cn/upload/skill/000/000/081/179181013081932.jpg" alt="python-parallelization" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a href="/xiazai/skill8054" title="python-parallelization">python-parallelization</a>
<p>将顺序 Python 代码转换为并行/并发实现,用于在需要并行化 Python 代码、提升性能时使用。</p>
</div>
<a href="/xiazai/skill8054" title="python-parallelization" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
</div>
</div><h1>若需取消:t.cancel()</h1><p>注意:Timer 启动后,主线程退出会导致定时器失效,所以脚本最后通常要加 input("按回车退出或等待关机...") 或用 while True: time.sleep(3600) 保活。
需要真正“定时”(比如每天凌晨2点)就得用 Windows 任务计划程序,Python 脚本只负责注册
Python 本身没有系统级定时能力,硬在脚本里轮询或用 schedule 库都不可靠(脚本关闭就失效)。正确做法是让 Python 调用 schtasks 命令把自身注册为计划任务。
示例:创建一个每天 2:00 执行关机的任务:
os.system(r'schtasks /create /tn "AutoShutdown" /tr "shutdown /s /t 0" /sc DAILY /st 02:00 /rl HIGHEST')
要点:
-
/tn是任务名,重复执行会报错,可先用schtasks /query /tn "AutoShutdown"检查 -
/tr中的命令路径要写绝对路径(如C:\Windows\System32\shutdown.exe /s /t 0),否则可能找不到 -
/rl HIGHEST表示以最高权限运行,否则关机命令会被拒绝 - 任务创建后,用户注销或系统重启不影响它运行
删除任务只需:schtasks /delete /tn "AutoShutdown" /f
权限和 UAC 是最大拦路虎,绕不开就得提前处理
即使脚本以管理员身份运行,UAC 弹窗仍可能阻断 shutdown 执行,尤其在计划任务中。解决方式只有两个:
- 确保任务计划程序中勾选“使用最高权限运行”,且触发条件设为“不管用户是否登录都要运行”(需配置密码,脚本无法自动填)
- 改用
shutdown /s /f /t 0中的/f(强制)参数,能关闭多数无响应程序,但对服务类进程不一定有效
另一个容易被忽略的点:如果目标机器启用了快速启动(Fast Startup),关机实际是混合关机状态,下次开机变冷启动,可能导致定时重启失败。建议在电源选项中关闭“启用快速启动”。

















