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