如何将我的无线键盘作为标准输入分配给 python3 脚本?
How to assign my wireless keyboard as stdin to a python3 script?
我有一个连接到 raspberry pi 的无线键盘。现在,当我启动 Pi 时,键盘将在登录提示时“挂起”。
整个设置是无头的,我想通过 SystemD 将键盘同时分配给 python3 脚本 运行。
流位于:
/dev/input/event0
正如我所说,如果脚本完全劫持键盘就可以了。
更新
我的另一个选择是在启动时直接进入我的程序,而不是默认的 shell 提示符。这将确保它具有键盘的“焦点”。
好的,我找到了一个非常简单的答案:因为你的系统上已经安装了 python-evdev,你可以在你的 python3 程序中使用这个模块来实现你想要的.将 import evdev
添加到 python3 程序的顶部。然后,你必须首先在你的程序中创建一个 evdev.device.InputDevice
作为参数(你的键盘路径)的 "/dev/input/event0"
。然后,调用 evdev.device.InputDevice.grab
,它应该完成了!我没有你程序的代码,但我写了一个小示例程序:
import evdev, sys
if __name__ == "__main__":
dev = evdev.device.InputDevice("/dev/input/event0")
try:
dev.grab()
except IOError:
print("error : /dev/input/event0 has already been grabbed")
sys.exit(1)
else:
count = 0
while count <= 100:
instr = input("Enter something : ")
print("You entered : " + instr)
count += 1
try:
dev.ungrab() # important : free your keyboard when the script exits !
except IOError:
print("error : /dev/input/event0 has already been released")
sys.exit(1)
编辑:
我发现上面的示例程序不会自动捕获击键并向您发送文本。您必须手动执行此操作,可以找到示例 here
我有一个连接到 raspberry pi 的无线键盘。现在,当我启动 Pi 时,键盘将在登录提示时“挂起”。
整个设置是无头的,我想通过 SystemD 将键盘同时分配给 python3 脚本 运行。
流位于:
/dev/input/event0
正如我所说,如果脚本完全劫持键盘就可以了。
更新
我的另一个选择是在启动时直接进入我的程序,而不是默认的 shell 提示符。这将确保它具有键盘的“焦点”。
好的,我找到了一个非常简单的答案:因为你的系统上已经安装了 python-evdev,你可以在你的 python3 程序中使用这个模块来实现你想要的.将 import evdev
添加到 python3 程序的顶部。然后,你必须首先在你的程序中创建一个 evdev.device.InputDevice
作为参数(你的键盘路径)的 "/dev/input/event0"
。然后,调用 evdev.device.InputDevice.grab
,它应该完成了!我没有你程序的代码,但我写了一个小示例程序:
import evdev, sys
if __name__ == "__main__":
dev = evdev.device.InputDevice("/dev/input/event0")
try:
dev.grab()
except IOError:
print("error : /dev/input/event0 has already been grabbed")
sys.exit(1)
else:
count = 0
while count <= 100:
instr = input("Enter something : ")
print("You entered : " + instr)
count += 1
try:
dev.ungrab() # important : free your keyboard when the script exits !
except IOError:
print("error : /dev/input/event0 has already been released")
sys.exit(1)
编辑:
我发现上面的示例程序不会自动捕获击键并向您发送文本。您必须手动执行此操作,可以找到示例 here