Shell和Python获取键盘事件

Shell和Python可以说是Linux环境中很常用的脚本语言了,可以方便地实现运维、测试等等自动化,减轻人的负担。
很多时候,脚本也需要和用户进行简单的交互,例如读取键盘输入。响应键盘事件和读取输入还是不同的。响应键盘事件指的是判断哪个按键被按下,用户按下某一按键后立即响应,例如按下q键立即退出程序。而读取输入则一般是用户输入一行后,按下回车,则程序读入这一行字符串。
读取输入比较常用,在Shell中可以使用read,在Python中可以使用input()或者sys.stdin.readline()等。
如果需要实现对用户按下键盘按键的响应,可以通过以下方式实现。

Shell

Shell中可以用read实现按键检测(解释器使用bash)。
read -rsN1 input
上述代码的含义是获取键盘按键,并存放到input中。其中read的参数含义如下:

  • -r:禁用转义字符。
  • -s:安静模式,不将输入显示出来。例如按下按键A后,字母A不会显示在命令行里。
  • -N1:严格读取一个字符后结束,换行符也算一个字符。

这样就可以获取键盘按下的按键信息了。例如,用户按下W、S、A、D四个按键后,显示前(Forward)后(Backward)左(Left)右(Right),按下Q键退出,代码如下:

while true; do
    read -rsN1 input
    if [[ "$input" == "w" ]]; then
        echo "Forward"
    elif [[ "$input" == "s" ]]; then
        echo "Backward"
    elif [[ "$input" == "a" ]]; then
        echo "Left"
    elif [[ "$input" == "d" ]]; then
        echo "Right"
    elif [[ "$input" == "q" ]]; then
        echo "Quit!"
        break
    else
        continue
    fi
done

上面的代码也可以获取按下回车键的事件。不过如果要判断按下的按键是回车键,不能直接用if [[ "$input" == "\n" ]]; then这样判断,而是要利用echo -e进行转义:

if [[ "$input" == `echo -e "\n"` ]]; then
        echo "You pressed enter!"
fi

Python

在Python中获取键盘事件,可以使用keyboard模块。
pip install keyboard或者pip3 install keyboard安装该模块。同样实现前面例子的功能,代码如下:

import keyboard

while True:
    if keyboard.is_pressed('w'):
        print('Forward')
    elif keyboard.is_pressed('s'):
        print('Backward')
    elif keyboard.is_pressed('a'):
        print('Left')
    elif keyboard.is_pressed('d'):
        print('Right')
    elif keyboard.is_pressed('enter'):  # if key 'enter' is pressed 
        print('You pressed enter!')
    elif keyboard.is_pressed('q'):
        print('Quit!')
        break

不过shell和python对于是否显示输入的处理不太一样。使用shell脚本时,键盘按下的按键内容是不会显示的(因为使用了-s选项)。而使用python时,程序执行过程中会在输出中显示你按下的按键。而且如果是在命令行中运行这个脚本,脚本退出后,你按下的按键又会在命令行里显示,并且被命令行读取一遍,甚至执行(如果按下一些按键之后按下了回车),感觉不太优雅。例如,如果在python脚本执行过程中,你恰好依次按下了D、A、T、E键(小写)和回车,那么程序退出后,命令行真的会读取date和回车,然后执行date,打印出日期和时间。

posted @ 2020-08-16 14:27  星夜之夏  阅读(11277)  评论(0编辑  收藏  举报