首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > perl python >

python 无拥塞获取键盘输入

2013-07-04 
python 无阻塞获取键盘输入!如题,现在设计一个简单脚本程序,相当于起一个server,监听网络连接,有连接的时

python 无阻塞获取键盘输入!
如题,现在设计一个简单脚本程序,相当于起一个server,监听网络连接,有连接的时候就输出消息通知,大概就是这样的一个程序,没有图形界面,就运行一个监听的循环。现在的问题在于,这个程序要能随时监听键盘输入,比如输入一个字符串'quit',程序要能退出,难点在于不能阻塞,也就是说输入quit后就退出,而不是等待回车。。。一直等在那里,现在不知如何实现。。。望各位大侠给出建议,谢谢
[解决办法]
这需要实时、逐个读入字符,有很多很方便的系统提供的功能(如命令行编辑,命令行历史等)都没有了(除非自己编程)。
你可以通过下面的例子体会一下。
(注:主要代码取自http://code.activestate.com/recipes/134892/。)


## {{{ http://code.activestate.com/recipes/134892/ (r2)
import sys
class _Getch:
    """Gets a single character from standard input.  Does not echo to the
screen."""
    def __init__(self):
        try:
            self.impl = _GetchWindows()
        except ImportError:
            self.impl = _GetchUnix()

    def __call__(self): return self.impl()


class _GetchUnix:
    def __init__(self):
        import tty, sys

    def __call__(self):
        import sys, tty, termios
        fd = sys.stdin.fileno()
        old_settings = termios.tcgetattr(fd)
        try:
            tty.setraw(sys.stdin.fileno(), termios.TCSANOW)
            ch = sys.stdin.read(1)
            sys.stdout.write(ch)
        finally:
            termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
        return ch


class _GetchWindows:
    def __init__(self):
        import msvcrt

    def __call__(self):
        import msvcrt
        return msvcrt.getch()


getch = _Getch()
## end of http://code.activestate.com/recipes/134892/ }}}

command = ""
while True:
    ch = getch()
    if ch == "\r":
        print("\nExecute command: " + command)
        command = ""
        sys.stdout.write("\033[80D")
    else:
        command += ch
        if command == "quit":


            sys.stdout.write("\033[80D")
            print "\nBye."
            break

热点排行