
本文介绍一种基于读取 macOS 系统偏好设置 plist 文件的方法,使用标准库 plistlib 和 pathlib 安全获取当前激活的键盘输入法布局,无需第三方依赖,兼容 macOS 12+(Monterey 及更新版本)。
本文介绍一种基于读取 macos 系统偏好设置 plist 文件的方法,使用标准库 `plistlib` 和 `pathlib` 安全获取当前激活的键盘输入法布局,无需第三方依赖,兼容 macos 12+(monterey 及更新版本)。
macOS 将用户级输入法配置(包括当前选中的键盘布局)持久化存储在 ~/Library/Preferences/com.apple.HIToolbox.plist 文件中,其中键 AppleSelectedInputSources 是一个包含多个输入源字典的数组,第二个元素(索引为 1)通常对应当前前台应用所使用的活跃布局(注意:该行为在较新 macOS 版本中稳定,但苹果未公开承诺索引语义;实践中索引 0 常为系统默认/首选项,索引 1 更可靠地反映实时切换状态)。
以下是一个健壮、可直接运行的实现:
import plistlib
from pathlib import Path
def get_current_keyboard_layout_macos():
"""
获取 macOS 当前活跃键盘布局(输入法)。
返回值示例:{'InputSourceKind': 'Keyboard Layout', 'KeyboardLayout ID': '65763', 'KeyboardLayout Name': 'ABC'}
若失败则返回 None。
"""
plist_path = Path("~/Library/Preferences/com.apple.HIToolbox.plist").expanduser()
# 检查文件是否存在
if not plist_path.exists():
print(f"错误:配置文件不存在 — {plist_path}")
return None
try:
with plist_path.open("rb") as f:
data = plistlib.load(f)
sources = data.get("AppleSelectedInputSources")
if not isinstance(sources, list) or len(sources) <p>⚠️ <strong>注意事项</strong>:</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill12031" title="Todo List for MacOS"><img
src="https://img.php.cn/upload/skill/001/246/273/6adaf20dbae7c507.jpg" alt="Todo List for MacOS" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill12031" title="Todo List for MacOS" class="overflowclass">Todo List for MacOS</a>
<p class="overflowclass">仅限macOS - 通过AppleScript管理macOS提醒事项应用。支持全功能提醒管理:添加、列出、完成、删除、搜索、创建列表等。</p>
</div>
<a rel="nofollow" href="/xiazai/skill12031" title="Todo List for MacOS" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div>
- 该方法依赖用户偏好文件,需确保 Python 进程有权限读取
~/Library/Preferences/目录(通常默认允许,但若启用了完全磁盘访问限制,可能需在「系统设置 → 隐私与安全性 → 完全磁盘访问」中为终端/IDE 授权); -
AppleSelectedInputSources[1]的语义虽在近年 macOS 中稳定,但仍属逆向工程结论;如需更高可靠性,建议结合IOKit或Carbon框架调用原生 API(需pyobjc),但会引入外部依赖; - 不同语言环境(如中文简体输入法)可能返回类似
{"InputSourceKind": "Non Keyboard Input Method", "InputSourceID": "com.sogou.inputmethod.sogou.pinyin"}的结构,此时应优先解析InputSourceID或InputSourceName字段; - 此函数不触发权限弹窗,纯读取本地配置,适合自动化脚本与轻量工具集成。
综上,该方案以最小侵入性、零第三方依赖的方式,精准适配 macOS 键盘布局查询需求,是跨平台键盘检测逻辑中 macOS 环节的理想补充。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










