当前位置: 首页 > 面试题库 >

aysncio无法在Windows上阅读stdin

庄实
2023-03-14
问题内容

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

我尝试这样做是受SO的启发:

import asyncio
import sys


def reader():
    print('Received:', sys.stdin.readline())


loop = asyncio.get_event_loop()
task = loop.add_reader(sys.stdin.fileno(), reader)
loop.run_forever()
loop.close()

但是,它会引发一个OSError: [WInError 100381] An operation was attempted on something that is not a socket

是否可以将类似文件的对象stdin包装在类中以为其提供套接字的API?我已经单独询问了这个问题,但是如果解决方案很简单,请在此处回答。

假设我无法包装类似文件的对象以使其成为套接字,我尝试使用受此要旨启发的流:

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()

这引起了NotImplementedErrorasyncio.base_events._make_read_pipe_transport

请告知如何在Windows上阅读stdin使用asyncio


问题答案:

NotImplementedError引发异常,因为连接管协程不被支持SelectorEventLoop,这是默认的事件循环集asyncio。您需要使用ProactorEventLoopWindows支持Windows上的管道。但是,它仍然不起作用,因为在Windows中,connect_read_pipeandconnect_write_pipe函数显然不支持Python
3.5.1中的stdin/ stdout/stderr或文件。

一种stdin使用异步行为进行读取的run_in_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_in_executor方法在另一个线程内调用该函数。线程将保持阻塞状态,直到stdin收到换行符为止,与此同时,循环可以自由执行其他协程(如果存在)。



 类似资料:
  • 问题内容: 我安装了Python 2.7和NumPy。我已经下载了SciPy的预构建二进制文件,但是安装脚本因以下错误而失败: 找不到Blas库。可以在文件(部分)中指定搜索目录的目录,也可以通过设置BLAS环境变量来指定 目录。 我真的对这件事还不了解。我以为这是一个简单的安装过程,但事实并非如此。我用Google搜索了BLAS环境变量,但是找不到任何合适的变量。任何帮助表示赞赏。 麦克风 编辑

  • 在 Windows 上执行命令将返回以下结果: 运行诊断程序会产生以下结果:

  • 我是新来的,我正在学习使用方法等等,我在方法中有我的代码,但在代码中有一个控制台。ReadLine();这是我不想要的。基本上,我需要做的是一个包含10个方法的大作业,作为输入,你必须调用哪个方法,然后调用实际的输入,但是当我的方法中有一个readline时,我必须给出3个,而不是2个。如果有人知道如何帮助noob,我的代码如下 基本上是int.parse(consolereadline);我需要

  • Invoke-Neo4j:无法确定E:\neo4j处的安装版本 在行:1字符:175 尝试{unblock-file-path'e:\neo4j\bin\neo4j-management*.*'-erroraction'silentlycontinue'>catch<>;import-module null

  • 问题内容: 以下代码在Windows下的node.js中产生异常: 这是消息: 当我删除时,它工作正常。是什么原因造成的?我尝试关闭防火墙,但没有任何效果。 问题答案: node.js使用c-ares解析器,并且完全忽略系统解析器。因此,有关C:\ WINDOWS \ system32 \ drivers \ etc \ hosts的建议可能无关紧要。 c-ares库读取某些系统配置文件-例如,在