使用 termios 改变捕获击键的方式

问题描述

我正在尝试运行“Programming Robots with ROS”一书中的以下示例脚本

#!/usr/bin/env python
import rospy
import sys,select,tty,termios
from std_msgs.msg import String

if __name__=='__main__':
    key_pub = rospy.Publisher('keys',String,queue_size=1)
    rospy.init_node("keyboard_driver")
    rate= rospy.Rate(100)
    old_attr = termios.tcgetattr(sys.stdin)
    tty.setcbreak(sys.stdin.fileno())
    print "Publishing keystrokes. Press Ctrl-C to exit..."
    while not rospy.is_shutdown():
        if select.select([sys.stdin],[],0)[0] == [sys.stdin]:
            key= sys.stdin.read(1)
            print(key)
            key_pub.publish(key)
            #key_pub.publish(sys.stdin.read(1))
        rate.sleep()
    termios.tcsetattr(sys.stdin,termios.TCSADRAIN,old_attr)

我发现以下问题:

  1. select 不执行预期的操作。运行此脚本后,它永远不会进入 if 部分(因此永远不会执行 print(key))。
  2. 当我按 Ctrl-C 时,程序会完成,但似乎 termios.tcsetattr(sys.stdin,old_attr) 从未执行过,因为终端变得不可用。 (击键捕获未恢复默认)

这里出了什么问题?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)