2012-04-07 10 views
7

Ich versuche, einen Stream mit Python mit Arecord aufzunehmen und zu konvertieren.Background Process subprocess.Popen mit Pipe

In der Shell ist dies ein Befehl mehr oder weniger wie:

arecord -B 5000 -f dat | lame -m j -q 5 -V 2 - test.mp3 & 

In Python Ich habe versucht, dies mit subprocess.Popen:

reccmd = ["arecord", "-B", "5000", "-f", "dat"] 
mp3cmd = ["lame", "-m", "j", "-q", "5", "-V", "2", "-", "test.mp3"] 
p = subprocess.Popen(reccmd, stdout=subprocess.PIPE) 
p2 = subprocess.Popen(mp3cmd, stdin=p.stdout) 
p2.communicate() 

Aber ich weiß nicht, wie die einschließen „&“ oder etwas ähnliches in dem Code in der Lage sein, die Aufzeichnung mit einem

killall arecord Befehl zu stoppen

Antwort

9

Wenn der Haupt-Python-Prozess während der Ausführung der Unterprozesse nicht blockiert werden soll, rufen Sie einfach p2.communicate() nicht auf. Die Aufrufe an subprocess.Popen() blockieren nicht.

+1

Vielen Dank. Vergeudete Stunden versuchen einen Ausweg zu finden und manchmal ist die Antwort einfach so –