/ / pythonからのパイプでbashコマンドを実行する - [python]、[command-line]、[output]

Pythonのパイプでbashコマンドを実行する[duplicate] - python、コマンドライン、出力

私はpython内からbashコマンドを実行して出力を得たいと思いました。

ifconfig | sed "/^$/d" | awk "NR > 1 { print $2 }"

私はすでに試しました:

p =subprocess.Popen(["ifconfig | sed "/^$/d" | awk "NR > 1 { print $2 }""], stdout = PIPE.)
out = p.communicate()

そしてプロセスをより小さなものに分割する:

p1とp2そしてp1出力をp2に渡すがこれはうまくいかない

どうすればいい?

回答:

回答№1は2

shell=True 分割するつもりがない場合は必要ですあなた自身の複数のサブプロセス - この場合、あなたはあなたのコマンドを評価し、それを個々のパイプラインコンポーネントに分解し、それらのコンポーネントを起動するためのシェルを必要とします。通常、シェルはこの方法で文字列を解析します(配列を渡すこともできますが、最初のエントリ以外のものはシェルへの追加の引数になります)。 $1, $2最初の配列エントリとして渡されたスクリプト内で一重引用符の外側で使用されている場合など。

p = subprocess.Popen("ifconfig | sed "/^$/d" | awk "NR > 1 { print $2 }"",
shell=True, stdout=subprocess.PIPE)

あるいは、シェルをまったく必要としないようにするために、自分でプロセスを接続して起動することができます(信頼できない入力やセキュリティに敏感なシナリオを扱う場合は非常に好ましい方法です。シェルを使用すると、Shellshockなどのセキュリティ上の脆弱性が発生する可能性があります)。

from subprocess import Popen, PIPE

p1 = Popen(["ifconfig"],                                    stdout=PIPE)
p2 = Popen(["sed", "/^$/d"],               stdin=p1.stdout, stdout=PIPE)
p3 = Popen(["awk", "NR > 1 { print $2 }"], stdin=p2.stdout, stdout=PIPE)
stdout, _ = p3.communicate()