将二进制输出从外部程序实时转换为变量



我正在输出

parec -d "name"

你不需要知道这个命令,只要你按下回车键,它就会输出代表音频的二进制数据。

我的目标是用python实时读取这些内容,即启动它并将其置于变量"data"中,我可以使用诸如

之类的内容读取。
data = p.stdout.read()

What I tried

p = subprocess.Popen(['parec','-d','"name"'],stdout=subprocess.PIPE,shell=True)
while True:
   data = p.stdout.read()

但是这将导致没有数据被接收。

parec -d "name" > result.raw

是可读的音频程序,并包含所需的数据。那么python的命令是什么呢?

在子进程上调用read()时。我相信它会阻塞直到parec退出

我很确定这个解决方案不应该阻塞:)

找到解决方案

from subprocess import Popen, PIPE, STDOUT
p = Popen('c:/python26/python printingTest.py', stdout = PIPE, 
        stderr = PIPE)
for line in iter(p.stdout.readline, ''):
    print line
p.stdout.close()
使用子进程
获取实时输出

您不应该使用p.stdout.read()(这会等待所有数据)或p.stdout.readline()(这会读取一行数据,如果是二进制则没有什么意义)。相反,您可以使用p.stdout.read(4096),例如,它将等待直到4096字节存在并返回它们。

没有办法在文件对象上使用方法来读取"到目前为止所有可用的",但是如果你去到较低级别的文件句柄,有一种方法:

data = os.read(p.stdout.fileno(), 4096)

这将等待,直到至少有一个字节可读,但然后返回所有可用的字节,最大长度为4096。

我的例子中的数字4096有点随意。如果数据来得很快,也可以使用更大的值。

最新更新