我正在使用keyboard包捕获python程序中的关键事件。使用下面的简单脚本:

import keyboard

while True:
    try:
        if keyboard.is_pressed('ESC'):
            break
        else:
            pass
    except:
        break

当我在terminal中运行这个脚本时,它会按预期的方式运行,直到程序关闭,这时我键入的所有内容都作为shell命令输入bash终端。这可能是危险的,因为每一条线路都有可能造成不利的系统影响。
有什么解决办法吗?首选纯python解决方案,但bash中的脚本初始化参数是合适的。

最佳答案

您正在使用全局键盘挂钩读取单个终端的输入。这是一个糟糕的设计,因为它监视用户可能对其他程序意味着的事件,它阻止您的程序像正常的终端程序一样工作(例如,它不会在ssh上运行),并且由于您不触摸自己的输入队列,您将看到重复的输入(正如您发现的那样)。
更好的解决方案是将TTY设置为RAW模式,并继续读取单个按键,直到您想退出。

#!/usr/bin/env python3
import termios, tty, sys

# Save terminal settings
old = termios.tcgetattr(0)
# Disable buffering
tty.setcbreak(0)

# Read until Esc
while sys.stdin.read(1) != "\x1B":
  pass

# Set the terminal settings back
termios.tcsetattr(0, termios.TCSANOW, old)

如果您更喜欢您的设计,则可以在退出之前刷新输入队列:
import termios
termios.tcflush(0, termios.TCIFLUSH)

10-05 20:00