如何通过Python在Linux系统中检测screenreader是否处于运行或启用状态
Linux下Python检测屏幕阅读器运行状态的实现方案
常用检测方案
1. 进程特征匹配检测
这是兼容性最高的方案,Linux平台主流屏幕阅读器包括Orca、Speakup、BRLTTY、espeakup,均有固定进程名,可通过遍历进程列表匹配。
- 无第三方依赖实现(直接读取
/proc目录):
import os def is_screen_reader_running(): screen_reader_processes = {"orca", "speakup", "brltty", "espeakup"} for pid in os.listdir("/proc"): if pid.isdigit(): try: with open(f"/proc/{pid}/comm", "r") as f: process_name = f.read().strip().lower() if process_name in screen_reader_processes: return True except (PermissionError, FileNotFoundError): continue return False
- 基于
psutil的简化实现(需要先执行pip install psutil安装依赖):
import psutil def is_screen_reader_running(): screen_reader_processes = {"orca", "speakup", "brltty", "espeakup"} for proc in psutil.process_iter(["name"]): try: if proc.info["name"].lower() in screen_reader_processes: return True except (psutil.NoSuchProcess, psutil.AccessDenied): continue return False
2. 辅助技术接口状态检测
桌面环境下运行的屏幕阅读器通常会在系统接口中留下启用标记,比进程检测准确率更高:
- 读取GNOME/KDE桌面的 accessibility 配置项,示例:
import subprocess def is_a11y_screen_reader_enabled(): try: # 读取GNOME桌面的屏幕阅读器启用状态 result = subprocess.run( ["gsettings", "get", "org.gnome.desktop.a11y.applications", "screen-reader-enabled"], capture_output=True, text=True, check=True ) return "true" in result.stdout.strip().lower() except subprocess.CalledProcessError: return False
- 检测DBus上注册的屏幕阅读器服务,比如Orca会默认注册
org.gnome.Orca总线名称,可通过dbus-send命令或dbus-python库查询。
3. 环境变量检测
终端场景下的部分屏幕阅读器会设置专属环境变量,检测速度最快:
import os def check_screen_reader_env(): # brltty运行时会设置BRLTTY变量 if os.getenv("BRLTTY") is not None: return True # 部分辅助技术会设置ACCESSIBILITY_ENABLED标记 if os.getenv("ACCESSIBILITY_ENABLED", "0") == "1": return True return False
适配建议
目前没有100%覆盖所有场景的检测方案,建议组合多种检测逻辑提高准确率。检测到屏幕阅读器运行时,建议自动关闭基于termios实现的raw模式、光标定位、清屏等特殊终端操作,改用纯文本逐行输出、标准输入读取的交互逻辑,屏幕阅读器可以正常识别这类内容。
内容的提问来源于stack exchange,提问作者wasp256
相关产品推荐
相关产品推荐

