Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的文件到套接字适配器_Python_Sockets_Asynchronous_Serial Port_Stdin - Fatal编程技术网

python中的文件到套接字适配器

python中的文件到套接字适配器,python,sockets,asynchronous,serial-port,stdin,Python,Sockets,Asynchronous,Serial Port,Stdin,我想使用Windows上的库来读取类似文件的对象,如sys.stdin和 但是,在Windows上使用asyncio 是否可以编写一个适配器类,用套接字的API包装一个类似文件的对象,这样我就可以将stdin和串行端口与asyncio一起使用 如果是这样,你能举个例子吗,因为我以前从未使用过插座?简短回答 不,也许是的 长话短说 您不能仅仅将一个类似文件的对象包装为套接字,反之亦然,并期望它能够正常工作。asyncio在幕后使用系统调用来实现它的异步魔法,而从系统的角度来看,无论您对stdin进

我想使用Windows上的库来读取类似文件的对象,如sys.stdin和

但是,在Windows上使用asyncio

是否可以编写一个适配器类,用套接字的API包装一个类似文件的对象,这样我就可以将stdin和串行端口与asyncio一起使用

如果是这样,你能举个例子吗,因为我以前从未使用过插座?

简短回答 不,也许是的

长话短说 您不能仅仅将一个类似文件的对象包装为套接字,反之亦然,并期望它能够正常工作。asyncio在幕后使用系统调用来实现它的异步魔法,而从系统的角度来看,无论您对stdin进行了多少包装,stdin都是stdin。当使用默认的SelectorEventLoop时,它使用一个类似的系统调用。在Windows上,它使用系统调用,它只支持套接字

因此,在windows上选择“吸盘”。还有别的选择吗?对在Windows上,并且仅在Windows上,还有另一个用于执行异步操作的API,称为IOCP I/O完成端口。它是一种完成时通知型多路复用器,而不是基于选择的就绪时通知型多路复用器。API比对文件执行简单的select调用复杂得多,但幸运的是,asyncio已经对其提供了一些支持

ProactReventLoop在Windows上使用IOCP,理论上它应该支持从stdin读取。我没有访问Windows计算机的权限,因此无法测试此功能,但请尝试一下:

# vim: filetype=python3 tabstop=2 expandtab

import asyncio as aio
import os
import sys

if os.name == "nt":
  proactor_loop = aio.ProactorEventLoop()
  aio.set_event_loop(proactor_loop)

@aio.coroutine
def main(loop):
  stdin_reader = aio.StreamReader()
  stdin_transport, stdin_protocol = yield from loop.connect_read_pipe(
    lambda: aio.StreamReaderProtocol(stdin_reader),
    sys.stdin
  )

  line = yield from stdin_reader.read()
  print(line.strip().decode("utf-8"))

  stdin_transport.close()

loop = aio.get_event_loop()
loop.run_until_complete(main(loop))
loop.close()
并在Windows上运行与此等效的程序:

$ echo blha blha blha | python test.py
blha blha blha
如果这样做有效,那么至少可以在Windows上执行异步stdin。然后,您可以为stdout/stderr或者甚至串行端口尝试类似的方法

如果所有其他操作都失败,则始终可以通过使用loop.run\u in\u executor协同程序在线程中包装阻塞调用来模拟异步行为:

yield from loop.run_in_executor(None, sys.stdin.readline)

不幸的是,示例无法正常工作:stdin_reader.read-part-with-OSError:[WinError 6]句柄无效errorAhh,我担心它无法正常工作。-使用线程池,即run_in_executor应该可以正常工作,并且应该足以满足大多数使用情况。而不是使用sys.stdin,os.fdopensys.stdin.fileno,'rb'可以工作吗?为文件句柄而不是textiowrapper传入新的二进制文件对象。