如何在 Unix 上从 Python 3 读取单个 CLI 按键而不需要 ENTER 或 root 权限?

问题描述 投票:0回答:1

标题中描述的问题显然非常困难。我找到的每一个解决方案(仅在 SO 中就有几十个)都不足以满足以下至少一个原因:

  • Python 2 特定;
  • 不必要的可移植/跨平台(因此具有不必要的依赖性);
  • 需要图形用户界面;
  • 要求用户按 Enter,Python 才能看到输入;
  • 需要 root 权限才能安装或运行。

对于我来说,作为一个非 root 程序员,有没有办法实现一个 Python 3 脚本,可以由非 root 用户在 Unix 环境中的终端 CLI 上运行,这样

  1. 将提示打印到标准输出,
  2. 然后读取用户发出的 单个按键,并且
  3. 然后根据用户按下的键的值执行操作

我强调,我不能为此使用(非标准)

keyboard
模块,因为为了安装此模块以便非root用户可以使用它,必须拥有root权限,而我没有。另外,我不想仅仅为了使其可以在 Windows 或任何其他非 Unix 操作系统上运行而给脚本添加依赖项。 IE。就我的目的而言,最小化依赖性比跨平台可操作性更重要。

python python-3.x unix keyboard keyboard-events
1个回答
0
投票

这应该可以在 unix/linux 上运行而没有问题(如果不能在 python 3.12 上运行,你可以通过最小的更改来适应它):

#! /usr/bin/env python3.12

import sys
import tty
import termios
from contextlib import contextmanager

@contextmanager
def raw(f):
    fd = f.fileno()
    try:
        old = tty.setraw(fd, when=termios.TCSADRAIN)
        yield
    finally:
        termios.tcsetattr(fd, termios.TCSADRAIN, old)
    
def readch(f):
    with raw(f):
        return f.read(1)


print(f"prompt: ", end="", flush=True)
ch = readch(sys.stdin)
print(f"{ch} ({ord(ch)})")
© www.soinside.com 2019 - 2024. All rights reserved.