Shell和Python获取键盘事件
Shell和Python可以说是Linux环境中很常⽤的脚本语⾔了,可以⽅便地实现运维、测试等等⾃动化,减轻⼈的负担。
很多时候,脚本也需要和⽤户进⾏简单的交互,例如读取键盘输⼊。响应键盘事件和读取输⼊还是不同的。响应键盘事件指的是判断哪个按键被按下,⽤户按下某⼀按键后⽴即响应,例如按下q键⽴即退出程序。⽽读取输⼊则⼀般是⽤户输⼊⼀⾏后,按下回车,则程序读⼊这⼀⾏字符串。
读取输⼊⽐较常⽤,在Shell中可以使⽤read,在Python中可以使⽤input()或者adline()等。
如果需要实现对⽤户按下键盘按键的响应,可以通过以下⽅式实现。
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!"
filinux换行按哪个键
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,打印出⽇期和时间。