Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.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 3.x 在python中,如何通过管道从另一个进程读取二进制数据?_Python 3.x_Io_Subprocess - Fatal编程技术网

Python 3.x 在python中,如何通过管道从另一个进程读取二进制数据?

Python 3.x 在python中,如何通过管道从另一个进程读取二进制数据?,python-3.x,io,subprocess,Python 3.x,Io,Subprocess,我使用以下命令启动另一个进程: p = subprocess.Popen(binFilePath, shell=False, stdin=PIPE, stdout=PIPE, stderr=PIPE, universal_newlines=False) 根据文档p.stdout现在应该有一个二进制数据流,因为universal\u newlines设置为False 如果另一个程序现在发送二进制数据,我如何读取它?尽管等待读取的数据量有限,但对以下命令的调用不会返回: returnedData

我使用以下命令启动另一个进程:

p = subprocess.Popen(binFilePath, shell=False, stdin=PIPE, stdout=PIPE, stderr=PIPE, universal_newlines=False)
根据文档
p.stdout
现在应该有一个二进制数据流,因为
universal\u newlines
设置为
False

如果另一个程序现在发送二进制数据,我如何读取它?尽管等待读取的数据量有限,但对以下命令的调用不会返回:

returnedData = p.stdout.read()

我想要的是管道中等待的数据量(如果有可用数据,则阻塞,直到数据可用)。那我该怎么做呢?

这并不简单,因为python不像其他编程语言那样是为这类东西而设计的

首先:必须将管道切换到非阻塞状态。否则,对
read()
的调用在所有情况下都将被阻止。这是通过以下代码完成的:

fd = p.stdout.fileno()
fl = fcntl.fcntl(fd, fcntl.F_GETFL)
fcntl.fcntl(fd, fcntl.F_SETFL, fl | os.O_NONBLOCK)
注意:请注意,
p.stdout
不是您对其他进程的输出流,而是进程的输出流,即您的输入流

现在我们有了一个非阻塞流,我们可以继续了

秒:等待数据可用。这可以通过
select()
完成:

据我所知,
exception
将永远不会收到任何数据,因为我们在这里处理管道

第三:现在让我们阅读数据:

temp = bytearray(4096)
numberOfBytesReceived = p.stdout.readinto(temp)
if numberOfBytesReceived <= 0:
    raise Exception("No data received!")
temp=bytearray(4096)
numberOfBytesReceived=p.stdout.readinto(温度)
如果收到NumberOfBytes
temp = bytearray(4096)
numberOfBytesReceived = p.stdout.readinto(temp)
if numberOfBytesReceived <= 0:
    raise Exception("No data received!")