You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 15:15:02