我正在输出
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有点随意。如果数据来得很快,也可以使用更大的值。