os.system()是最直接调用系统锁屏、关机命令的方式:windows锁屏用rundll32.exe user32.dll,lockworkstation,关机用shutdown /s /t 60;macos用pmset displaysleepnow或sudo shutdown -h now;linux用xdg-screensaver lock或sudo systemctl poweroff。

用 os.system() 调用系统命令最直接
Windows 和 macOS/Linux 锁屏、关机本质是调用系统级指令,Python 本身不内置这些功能,os.system() 是最快落地的方式。别绕路去装第三方库,除非你要做跨平台统一接口或带 GUI 的调度器。
常见错误是直接写 os.system("rundll32.exe user32.dll,LockWorkStation") 却没加引号包裹整个命令(尤其含空格或逗号时),导致 SyntaxError 或静默失败。
- Windows 锁屏:
os.system('rundll32.exe user32.dll,LockWorkStation') - Windows 关机(1 分钟后):
os.system('shutdown /s /t 60');立即关机加/f强制结束程序 - macOS 锁屏:
os.system('pmset displaysleepnow')(仅黑屏)或os.system('open -a ScreenSaverEngine')(触发屏保锁屏) - macOS 关机:
os.system('sudo shutdown -h now')(需提前配置免密 sudo,否则卡住) - Linux(GNOME)锁屏:
os.system('gnome-screensaver-command --lock')或os.system('xdg-screensaver lock') - Linux 关机:
os.system('sudo systemctl poweroff')(同样依赖 sudo 权限)
定时执行不能只靠 time.sleep()
用 time.sleep(3600) 然后锁屏,看似简单,但脚本一旦被意外中断(比如终端关闭、Ctrl+C)、系统休眠或 Python 进程崩溃,定时就彻底失效。这不是“定时”,只是“延迟执行”。
真正可靠的定时,得靠系统级任务调度器:
- Windows:用
schtasks命令注册为计划任务,例如:schtasks /create /tn "AutoLock" /tr "python C:\path\to\lock.py" /sc daily /st 22:00 - macOS/Linux:写进
crontab -e,例如每天 22:00 执行:0 22 * * * /usr/bin/python3 /path/to/lock.py - 注意:crontab 中的环境变量和终端不同,
DISPLAY和DBUS_SESSION_BUS_ADDRESS常缺失,导致 Linux 锁屏命令无效——需在脚本开头显式导出,如:export DISPLAY=:0 && export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
避免锁屏/关机被用户操作打断
有些场景下,你希望“只要用户 5 分钟没动鼠标键盘,就锁屏”,而不是固定时间点。这时候单纯定时不够,得检测空闲状态。
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
Windows 可用 ctypes 调用 GetLastInputInfo API;macOS/Linux 没标准接口,得依赖 xprintidle(Linux)或 ioreg(macOS)这类外部工具解析空闲毫秒数。
- Linux 示例(需先
apt install xprintidle):idle_ms = int(os.popen('xprintidle').read().strip()),然后判断是否 > 300000(5 分钟) - macOS 示例:
idle_ms = int(os.popen("ioreg -c IOHIDSystem | awk '/IdleTime/ {print $NF/1000000; exit}'").read().strip()) - 关键点:这类检测必须放在循环里 + 小间隔(如
time.sleep(30)),且整个脚本要常驻后台运行(推荐用nohup python idle_lock.py &或 systemd user service)
权限和路径问题最容易被忽略
脚本能运行不代表命令能成功执行。最常踩的坑是:路径含中文或空格没转义、sudo 密码交互阻塞、GUI 环境变量丢失、杀毒软件拦截 rundll32。
调试时别只看 Python 是否报错,要检查命令实际返回值:ret = os.system(cmd); print(f'Exit code: {ret}')。非 0 值基本意味着系统命令失败。
- Windows 下,如果用 VS Code 终端运行脚本却锁不了屏,试试换到原生 cmd 或 PowerShell —— 某些终端模拟器会截断 GUI 消息
- macOS 上
sudo shutdown若提示 “Operation not permitted”,不是权限问题,而是 SIP 保护机制限制,改用osascript -e 'tell app "loginwindow" to «event aevtrlgo»'触发关机对话框更稳妥 - 所有路径尽量用绝对路径,避免相对路径在 crontab 或后台运行时找不到文件
真正难的不是写几行代码,而是让命令在目标用户的实际登录会话里生效——尤其是多用户、远程桌面、自动登录等场景下,会话上下文一错,锁屏就变成“锁了个寂寞”。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










