Python aysncio无法在Windows上读取标准数据

Python aysncio无法在Windows上读取标准数据,python,windows,python-3.x,asynchronous,stdin,Python,Windows,Python 3.x,Asynchronous,Stdin,我正在尝试在Windows7 64位和Python 3.4.3上异步读取stdin 我试过这个,灵感来自: 但是,它会引发一个操作错误:[WInError 100381]尝试对非套接字的对象执行操作 像stdin这样的类似文件的对象是否可以包装在类中,为其提供套接字的API?我有,但如果解决办法很简单,请在这里回答 假设我无法将类似文件的对象包装为套接字,我尝试使用streams,灵感来自: 这会在asyncio.base\u事件中引发NotImplementedError。\u make\u

我正在尝试在Windows7 64位和Python 3.4.3上异步读取stdin

我试过这个,灵感来自:

但是,它会引发一个
操作错误:[WInError 100381]尝试对非套接字的对象执行操作

stdin
这样的类似文件的对象是否可以包装在类中,为其提供套接字的API?我有,但如果解决办法很简单,请在这里回答

假设我无法将类似文件的对象包装为套接字,我尝试使用streams,灵感来自:

这会在
asyncio.base\u事件中引发
NotImplementedError
。\u make\u read\u pipe\u transport


请建议如何在Windows上使用
asyncio
读取
stdin

由于
SelectorEventLoop
不支持,因此引发了
未实现错误
异常,这是
asyncio
上设置的默认事件循环。您需要使用支持Windows上管道的。但是,它仍然无法工作,因为显然
connect\u read\u pipe
connect\u write\u pipe
函数不支持
stdin
/
stdout
/
stderr
或Windows中的文件作为Python 3.5.1

使用异步行为读取
stdin
的一种方法是使用带有循环的
run\u in\u executor
方法的线程。以下是一个供参考的简单示例:

import asyncio
import sys

async def aio_readline(loop):
    while True:
        line = await loop.run_in_executor(None, sys.stdin.readline)
        print('Got line:', line, end='')

loop = asyncio.get_event_loop()
loop.run_until_complete(aio_readline(loop))
loop.close()

在本例中,函数
sys.stdin.readline()
在另一个线程中由
loop.run\u In\u executor
方法调用。线程一直处于阻塞状态,直到
stdin
收到换行符,同时循环可以自由执行其他协程(如果存在)。

Hm,但这似乎是阻塞,对吗?有没有办法获得这种非阻塞?@masi
aio\u readline()
是非阻塞的,程序本身通过使用
run\u直到完成()
进行阻塞。但是您应该只在应用程序中使用
wait循环.run\u in\u executor(None,sys.stdin.readline)
部分。其余的只是举例说明用法。
import asyncio
import sys


@asyncio.coroutine
def stdio(loop):
    reader = asyncio.StreamReader(loop=loop)
    reader_protocol = asyncio.StreamReaderProtocol(reader)
    yield from loop.connect_read_pipe(lambda: reader_protocol, sys.stdin)


@asyncio.coroutine
def async_input(loop):
    reader = yield from stdio(loop)
    line = yield from reader.readline()
    return line.decode().replace('\r', '').replace('\n', '')


@asyncio.coroutine
def main(loop):
    name = yield from async_input(loop)
    print('Hello ', name)


loop = asyncio.get_event_loop()
loop.run_until_complete(main(loop))
loop.close()
import asyncio
import sys

async def aio_readline(loop):
    while True:
        line = await loop.run_in_executor(None, sys.stdin.readline)
        print('Got line:', line, end='')

loop = asyncio.get_event_loop()
loop.run_until_complete(aio_readline(loop))
loop.close()