2016-06-16 2 views
0

bashの行awk -F'[][]' '/dB/ { print $2 }' <(amixer sget Master)は、私のシステムの現在のボリューム(「97%」など)を返します。 なぜこの有効なシェルコマンドは、サブプロセスを経由してPythonでエラーをスローしますか?

私はシェルからの出力が
/bin/sh: 1: Syntax error: "(" unexpected 
b'' 

なぜこれができないのとどのように私は自分のコードを修正すればよい

を返ししかしPythonの3

#!/usr/bin/env python3 
import subprocess 
command = "awk -F'[][]' '/dB/ { print $2 }' <(amixer sget Master)" 
output = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE).stdout.read() 

print(output) 

でこれを組み込むことを試みましたか?

+0

おかしい... –

+0

@UlrichEckhardtは、私は、Linuxに非常に新しいよ、あなたは何を説明することができますあなたはこれを意味しますか? – DenverCoder10

+1

シンプルに、エラーメッセージを読むべきヒントでした。たとえば、Bash(/ bin/bashまたは/ usr/bin/bash)ではなく、別のシェルである/ bin/shからのものです。あなたの "有効なシェルコマンド"(シェルがたくさんあるので存在しないものです)をシェルで試してみた場合、問題を理解し解決するには一歩近づいたでしょう。 –

答えて

1

すでに指摘したように、使用している構文はbash構文です(a.k.a.バーシズム)。 デフォルトシェルで使用されるsubprocess.Popen/bin/sh &です。process substitutionをサポートしていません。

使用するシェルをexecutable引数で指定できます。

これを試してください:あなたは「bashの」とこれをタグ付けされたが、エラーメッセージがどこから来たの読み込みに失敗しました

output = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, executable="/bin/bash").stdout.read() 
3

あなたはprocess substitutionの形でbashismを使用している、とあなた/bin/shはそれをサポートしていないので:

<(...) 

パイプにこれを変更すると、あなたの問題を解決する必要があります:

command = "amixer sget Master | awk -F'[][]' '/dB/ { print $2 }'" 

代替をあなたはshの中からbashを始めることができます:

command = "bash -c 'amixer sget Master | awk -F'\\''[][]'\\'' '\\''/dB/ { print $2 }'\\'''" 

しかし、あなたがすぐに気づくように、引用とエスケープは悪夢になるでしょう。

関連する問題