Python aysncio无法在Windows上读取标准数据
我正在尝试在Windows7 64位和Python 3.4.3上异步读取stdin 我试过这个,灵感来自: 但是,它会引发一个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
操作错误:[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,但这似乎是阻塞,对吗?有没有办法获得这种非阻塞?@masiaio\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()