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!")