Windows 版本的 Python, select() 函数只能接受 socket, 不接受 File Object, 所以不能 select 标准输入输出.
为此, 我开发了 win_stdio, 让 select 也能对 stdin/stdout 进行操作. 核心思想就是用 socket 作为 stdin/stdout 的代理. 结构示意如下:
stdin -> stdin_sock -> my_stdin stdout <- stdout_sock <- my_stdout
my_stdin 和 my_stdout 是 socket, 所以它们的 fileno 就可以用于 select 了.
首先一个线程读取 stdin, 写入 stdin_sock:
while True: data = os.read(sys.stdin.fileno(), 1024) if not data: break stdin_sock.send(data)
另一个线程读取 stdout_sock, 写入 stdout:
fd = sys.stdout.fileno() while True: data = my_stdout.recv(1024) if not data: break os.write(sys.stdout.fileno(), data)
win_stdio 的一个实际例子如下:
from stdio import stdio stdio.write('hello world') data = stdio.read() print stdio.STDIN_FILENO print stdio.STDOUT_FILENO
下载: win_stdio.zip