2016-06-01 7 views
-1

外部コマンドを(Pythonスクリプト内からUnixシェルで入力したように)呼び出すにはどうすればよいですか?Pythonの外部コマンドを呼び出す

私はこのコードを試してみました:

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

をし、それが動作します。 しかし、私はPythonスクリプトにこのコードをしようとすると:

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']) 

それは作品ありません。私はこのエラーを取得する:

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

私はUnixシェルで次のコマンドを入力します。

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

私が手:

正しいかどう
0.001754 

。出力のリダイレクトやパイプを解釈するシェルが存在しないため、現時点では何が起こっている

答えて

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

は、あなたが提供している残りの引数は、'2>&1', '|', 'sed', '-n', 's#^RMS amplitude:[^0-9]*\([0-9.]*\)$#\1#p']が引数としてsoxによって解釈されていることです。 callにシェルを使用するように指示すると、コマンドラインと同じ方法で解釈されます。

+0

が は今、私はエラーを持っていませんが、私は、スクリプトを実行すると、それは何の価値を与えていない、ありがとうバック。 os.system( "...")と同じです。それを印刷しなければならないのですか? – Mat

+0

なぜdownvoteが、わかりません。いいえ、 'call'はプログラムを実行しますが、出力は返されません。 'subprocess.check_output'は、プロセスが' stdout'や 'stderr'に書き込んだものを変数に取り込むことを望みます。 –

+0

さて、私はこれを試しました: 'output = subprocess.check_output(['ls'、 '-1']) '%dバイトの出力が'%len(出力) の出力 'にあり、99バイト出力と出力では、ファイルとディレクトリのリスト。 これを試してみました: 'output = subprocess.check_output([" sox /home/pi/OnoSW/data/opsoroassistant/rec.wav -n stat 2>&1 | sed -n 's#^ RMS振幅:出力 '%len(出力) 印刷出力'に%dバイトを出力します。 '%len(出力) 印刷出力 '%len(出力) 出力'%1!私は出力としてこれを持っています: '出力で2バイトありますが、出力自体はありません。 – Mat

0

またos.systemを使用することができます。

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

コール関数の引数は、コマンドと同じ文字列にする必要があります。

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

'shell = True'がセットされている場合のみ、そうでなければ'sed -arg1 -arg2 -argn'はファイル名の空白を含む実行可能ファイルであると考えてください –

+0

[ここ](https://docs.python.org/2/library/subprocess.html#frequentlyused-arguments) –

0

別のオプション(簡単に使用する)os.system(「元のコマンド」)である

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