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

20jt8wwn  于 2023-11-18  发布在  Unix
关注(0)|答案(1)|浏览(178)

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

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

对于我来说,* 作为一个非root程序员 ,有没有一种方法可以在终端CLI上实现一个Python 3脚本, 可由非root用户运行,在Unix环境中 *,
1.打印一个提示到stdout,
1.然后读取用户的 * 单个 * 按键,
1.然后根据用户按下的键的值执行操作

我强调我不能使用(非标准)keyboard模块,因为为了安装这个模块,以便它可以由非root用户使用,必须有root权限,我没有。此外,我不想让脚本只依赖于Windows,或任何其他非Unix操作系统上运行。也就是说,为了我在这里的目的,最小化依赖性比跨平台可操作性更重要。

brgchamk

brgchamk1#

这应该可以在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)})")

字符串

相关问题