Python によって呼び出される非常に長い 1 行のシェル コマンドがあります。コードは次のようになります。
# "first way"
def run_cmd ( command ):
print "Run: %s" % command
subprocess.call (command, shell=True)
run_cmd('''sort -n -r -k5 {3} |head -n 500|awk 'OFS="\t"{{if($2-{1}>0){{print $1,$2-{1},$3+{1},$4,$5}}}}' > {2}'''.format(top_count,extend/2,mid,summit))
これらのコードは機能しますが、常に次のように文句を言います。
sort: write failed: standard output: Broken pipe
sort: write error
awk: (FILENAME=- FNR=132) fatal: print to "standard output" failed (Broken pipe)
以前の回答によると、次のように、これを完了するにはより長いスクリプトを使用する必要があります。
# "second way"
p1 = Popen("sort -n -r -k5 %s"%summit, stdout=PIPE)
p2 = Popen("head -n 500", stdin=p1.stdout, stdout=PIPE)
# and so on ..........
私の質問は次のとおりです。
(1) 「第 2 の方法」が「第 1 の方法」より遅くなるかどうか
(2)とにかく「最初の方法」で書かなければならない場合(書く方が速いため)、次のような文句を避けるにはどうすればよいですかbroken pipe
(3) 「最初の方法」で書くべきではない最も説得力のある理由は何ですか?