python - 使用 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)
我发现以下问题:
- 选择不做应该做的事情。运行此脚本后,它永远不会进入 if 部分(因此
print(key)
永远不会执行)。 - 当我按 Ctrl-C 时,程序完成,但似乎
termios.tcsetattr(sys.stdin,termios.TCSADRAIN,old_attr)
永远不会执行,因为终端变得不可用。(按键捕获不恢复为默认值)
这里有什么失败?
解决方案
推荐阅读
- excel - Excel DNA XLL 配置 - 设置注释、描述和公司
- java - Tomcat(在 RHEL/CentOS 上)和 ProtectionDomain
- python - 如何根据每行的相应索引对列进行分组?
- react-redux - 如何阻止 useDispatch() 无限调度动作?
- xamarin.android - xamarin android中的推送通知
- c# - 将可为空的 Guid 发送到 WebApi Asp.net
- image - 使用 64 位操作在 openCV 中每次读/写访问多个像素
- corda - 使用 Postman 调用流的 API 时有效负载无效
- ruby-on-rails - ActiveRecord 关联的意义何在?
- assembly - 如何在 zOS 汇编程序中获取 UTC 值