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

时间:2013-05-19 23:38:25

标签: python python-2.7

我正在输出

parec -d "name"

您不需要知道此命令,只需知道按Enter键后,它会输出代表音频的二进制数据。

我的目标是用python实时读取它,即启动它并将其放在变量“数据”中,我可以用类似

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

我尝试了什么

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

while True:
   data = p.stdout.read()

但这导致没有收到任何数据。

parec -d "name" > result.raw

可通过音频程序读取,并且包含完全必要的数据。那么python的命令是什么?

2 个答案:

答案 0 :(得分:0)

当你在subprocess.PIPE上调用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()

这需要很多搜索,但可以在@ Getting realtime output using subprocess

找到此解决方案

答案 1 :(得分:0)

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

使用文件对象上的方法无法读取“到目前为止可用的所有内容”,但如果您转到较低级别的文件句柄,则有一种方法:

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

这将等到至少有一个字节要读取,但随后返回所有可用字节,最大长度为4096.

我的例子中的数字4096有点武断。如果数据快速进入,您也可以使用更大的值。