首页 > 解决方案 > 使用 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. 选择不做应该做的事情。运行此脚本后,它永远不会进入 if 部分(因此print(key)永远不会执行)。
  2. 当我按 Ctrl-C 时,程序完成,但似乎termios.tcsetattr(sys.stdin,termios.TCSADRAIN,old_attr)永远不会执行,因为终端变得不可用。(按键捕获不恢复为默认值)

这里有什么失败?

标签: pythonselectrostermios

解决方案


推荐阅读