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
,打印出日期和时间。