plyer可跨平台发送原生右下角通知,安装pip install plyer即可;它依赖系统工具(如macOS的osascript、Linux的notify-send),首次运行可能因缺失工具报错,需按提示补装;常见错误NotificationError通常源于Linux未装libnotify-bin或macOS权限未授权。

用 plyer 发送跨平台系统通知最省事
Windows/macOS/Linux 都能原生弹出右下角通知,不用自己调系统命令或装额外服务。前提是别想自定义图标大小、点击回调这些高级功能——plyer 只做基础推送,够用且稳定。
安装:pip install plyer。注意它依赖底层系统工具(比如 macOS 用 osascript,Linux 用 notify-send),所以首次运行可能报错“command not found”,先按提示装对应工具就行。
常见错误现象:NotificationError: No notification service available。这通常是因为 Linux 没装 libnotify-bin(Ubuntu/Debian 执行 sudo apt install libnotify-bin),或 macOS 的 osascript 被禁用(极少,一般不用管)。
示例代码:
立即学习“Python免费学习笔记(深入)”;
from plyer import notification <p>notification.notify( title='任务完成', message='数据清洗已结束,共处理 12,483 条记录', timeout=5 # 秒,不设默认 10 秒 )
Linux 下直接调 notify-send 更可控
如果你在写定时脚本(比如 cron),plyer 有时会因环境变量缺失失败,而 notify-send 命令更轻量、更可预测。
关键点:cron 环境里没加载桌面会话的 DBus 地址,直接跑 notify-send 会静默失败。必须显式传入 DBUS_SESSION_BUS_ADDRESS。
实操建议:
- 先手动查当前值:
echo $DBUS_SESSION_BUS_ADDRESS(通常形如unix:path=/run/user/1000/bus) - cron 里写成完整命令:
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus notify-send "任务完成" "导出 CSV 完毕" - 如果用户 ID 不固定,可在 cron 中用
pgrep -u $USER gnome-session >/dev/null && export DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep -u $USER gnome-session)/environ | cut -d= -f2-)动态获取(较重,仅必要时用)
macOS 上避免 osascript 权限弹窗
Python 调 plyer 或直接执行 osascript -e 'display notification ...' 第一次会触发系统权限请求:“是否允许 Python 发送通知?”——这在后台任务里卡住,且无法跳过。
解决办法只有两个:
- 手动提前授权:打开「系统设置 → 隐私与安全性 → 通知」,找到你的 Python 解释器(如
/usr/bin/python3或/opt/homebrew/bin/python3),勾选“允许通知” - 换用
terminal-notifier(需brew install terminal-notifier),它走的是终端应用通道,不触发新权限弹窗,命令为:terminal-notifier -title "完成" -message "备份已上传至 S3"
注意:terminal-notifier 不支持 timeout 参数,通知一直挂着直到用户关闭,别用于高频任务。
Windows 上用 win10toast 但得避开 UAC 和锁屏
win10toast 底层调 COM 接口,兼容 Win10/11,但有两个硬限制:
- UAC 提权后运行的脚本(比如以管理员身份启动的 Python),无法向普通用户会话发通知——会静默失败,无报错
- 用户锁屏时,通知根本不会显示(这是 Windows 设计,非 bug)
所以自动化任务若需可靠提醒,要么确保脚本以当前登录用户权限运行(不要加“以管理员身份运行”),要么改用任务计划程序 + 触发器方式,让任务在用户登录后自动执行并通知。
另外,win10toast 默认图标是 Python 图标,想换需提供 ICO 文件路径,且路径不能含中文或空格,否则加载失败不报错——容易被忽略。


















