5

サブプロセス呼び出しを正しくエスケープする際に問題が発生しています

ファイル内の行数をカウントするために呼び出したいsed -n "$=" /path/to/fileのですが、python から実行できません。私のコードは次のとおりです。

import subprocess

filename = "/path/to/file"

cmd = subprocess.Popen(["sed", "-n '$='", filename], stdout=subprocess.PIPE)
cmd_out, cmd_err = cmd.communicate()
num_lines = int(cmd_out.strip())

print num_lines

「-n '$='」のさまざまなエスケープの組み合わせを試しましたが、何もうまくいかないようです。

4

2 に答える 2

1

デフォルトでは、subprocess.Popen には shell=False があります。

シェルを呼び出さずに、各引数は解釈されずに sed に渡されるため、sed は引数を -n '$=' として読み取ります。

コマンド sed -n '$=' を実行すると、シェルはコマンド sed に送信する前に '' を削除します。

したがって、 $= は引用符なしである必要があります

また、Ignacio が指定したように、 -n $= 引数は別々にする必要があります

cmd = subprocess.Popen(["sed", "-n", "$=", filename], stdout=subprocess.PIPE)
于 2013-07-24T14:41:33.733 に答える