在 Python 中读取单个字符(getch 样式)在 Unix 中不起作用
每当我使用 http://code.activestate.com/recipes/134892/ 我似乎无法让它工作。 它总是抛出以下错误:
Traceback (most recent call last):
...
old_settings = termios.tcgetattr(fd)
termios.error: (22, 'Invalid argument)
我最好的想法是,这是因为我在 Eclipse 中运行它,所以 termios
抛出了有关文件描述符的错误。
Any time I use the recipe at http://code.activestate.com/recipes/134892/ I can't seem to get it working. It always throws the following error:
Traceback (most recent call last):
...
old_settings = termios.tcgetattr(fd)
termios.error: (22, 'Invalid argument)
My best thought is that it is because I'm running it in Eclipse so termios
is throwing a fit about the file descriptor.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这适用于 Ubuntu 8.04.1 、Python 2.5.2,我没有收到这样的错误。 也许你应该从命令行尝试它,Eclipse 可能使用它自己的标准输入,如果我从 Wing IDE 运行它,我会得到完全相同的错误,但从命令行它工作得很好。
原因是 IDE 例如 Wing 使用自己的类 netserver.CDbgInputStream 作为 sys.stdin
所以 sys.stdin.fileno 为零,这就是错误的原因。
基本上 IDE stdin 不是 tty(print sys.stdin.isatty() 为 False)
This is working on Ubuntu 8.04.1 , Python 2.5.2, i get no such error. May be you should try it from command line, eclipse may be using its own stdin, i get exact same error if I run it from Wing IDE, but from command line it works great.
Reason is that IDE e.g Wing is using there own class netserver.CDbgInputStream as sys.stdin
so sys.stdin.fileno is zero, thats why the error.
Basically IDE stdin is not a tty (print sys.stdin.isatty() is False)
将终端置于原始模式并不总是一个好主意。 实际上清除 ICANON 位就足够了。 这是具有超时支持的 getch() 的另一个版本:
Putting terminal into raw mode isn't always a good idea. Actually it's enough to clear ICANON bit. Here is another version of getch() with timeout support: