2016-06-01 21 views
-1

Wie kann ich einen externen Befehl (als ob ich es in der Unix-Shell eingegeben hatte) aus einem Python-Skript heraus aufrufen?Aufruf eines externen Befehls in Python

habe ich versucht, diesen Code:

from subprocess import call 
call(["ls", "-l"]) 

und es funktioniert. Aber wenn ich versuche, diesen Code in einem Python-Skript:

from subprocess import call 
call(['sox', '/home/pi/OnoSW/data/opsoroassistant/rec.wav', '-n', 'stat', '2>&1', '|', 'sed', '-n', 's#^RMS  amplitude:[^0-9]*\([0-9.]*\)$#\1#p']) 

es nicht funktioniert. Ich bekomme diese Fehlermeldung:

sudo python getRMSAmplitude.py sox FAIL stat: Summary effect: unknown option 

Wenn ich diesen Befehl in meinem Unix Shell eingeben:

sox ../../data/opsoroassistant/rec.wav -n stat 2>&1 | sed -n 's#^RMS  amplitude:[^0-9]*\([0-9.]*\)$#\1#p' 

ich:

0.001754 

Was richtig ist.

Antwort

1
call([...], shell=True) 

Was im Moment passiert, ist, dass der Rest der Argumente Sie anbieten, sind '2>&1', '|', 'sed', '-n', 's#^RMS amplitude:[^0-9]*\([0-9.]*\)$#\1#p'] von sox als Argumente interpretiert werden, weil es nicht eine Schale ist, die Umleitung der Ausgabe oder das Rohr zu interpretieren. Tell call, um eine Shell zu verwenden, und es wird auf die gleiche Weise wie Ihre Befehlszeile interpretiert werden.

+0

Danke, Jetzt habe ich keine Fehler, aber wenn ich das Skript ausführen gibt es keinen Wert zurück. Das gleiche gilt für os.system ("..."). Muss ich es ausdrucken oder so? – Mat

+0

Nicht sicher, warum der Downvote, aber ok. Nein, 'call' führt nur das Programm aus, es gibt keine Ausgabe zurück. Sie werden wollen, dass 'subprocess.check_output' den Prozess, den der Prozess in 'stdout' oder 'stderr' geschrieben hat, in eine Variable aufnimmt. –

+0

Nun habe ich das versucht: 'output = subprocess.check_output (['ls', '-1']) print 'Haben% d Bytes in Ausgabe'% len (Ausgabe) Druckausgabe 'und ich habe 99 Bytes in der Ausgabe und der Ausgabe eine Liste von Dateien und Verzeichnissen. und dann habe ich Folgendes versucht: 'output = subprocess.check_output ([" sox /home/pi/OnoSW/data/opsoroassistant/rec.wav -n stat 2> & 1 | sed -n 's #^RMS-Amplitude: [^0-9] * \ ([0-9.] * \) $ # \ 1 # p '"], shell = True) print' Haben% d Bytes in Ausgabe '% len (Ausgabe) Druckausgabe' und ich habe das als Ausgabe: 'Habe 2 Bytes in der Ausgabe', aber nicht die Ausgabe selbst. – Mat

0

Sie können auch os.system verwenden:

import os 
os.system("sox ../../data/opsoroassistant/rec.wav -n stat 2>&1 | sed -n 's#^RMS  amplitude:[^0-9]*\([0-9.]*\)$#\1#p'") 
-2

Die Argumente in der Anruffunktion in der gleichen Zeichenkette wie der Befehl sein sollte.

call('sed -arg1 -arg2 -argn') 
+0

Nur wenn 'shell = True' gesetzt ist, sonst wird es denke, dass 'sed -arg1 -arg2 -argn' eine ausführbare Datei mit Leerzeichen im Dateinamen ist –

+0

[hier] (https://docs.python.org/2/library/subprocess.html#frequently-used-arguments) –

0

eine weitere Option (einfacher zu verwenden) ist os.system (‚ursprünglichen Befehl‘)

import os 
os.system("sox ../../data/opsoroassistant/rec.wav -n stat 2>&1 | sed -n 's#^RMS  amplitude:[^0-9]*\([0-9.]*\)$#\1#p'")