1

python(3) からシェル コマンドを呼び出す最も安全で便利な方法を探しています。ここで ps から pdf への変換:

 gs -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile="${pdf_file}" "${ps_file}"

を使用subprocessし、shlex避けshell=Trueます。しかし、結果のコマンドには一貫性がありません。

cmd = ['gs', '-dBATCH', '-dNOPAUSE', '-sDEVICE=pdfwrite', '-sOutputFile={0}'.format(pdf_filename), ps_filename]

何が恋しい?! subprocess.call()構文は、スペースで区切られた引数で非常にきれいに見え、他の場所では混乱しているように見えます。

次の間で呼び出すときの違いは何ですかsubprocess.call(cmd)(Pythonレベルで、つまり、エスケープ、インジェクション保護、引用など):

cmd = ['do', '--something', arg]
cmd = ['do', '--someting {0}'.format(arg)]

ない場合、これも良い方法ですか?

cmd = ['gs', '-dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile={0} {1}'.format(pdf_filename, ps_filename)]

矛盾の別の例:

hg merge -r 3だろうcmd = ['hg', 'merge', '-r', revision_id]

hg merge --rev=3だろうcmd = ['hg', 'merge', '--rev={0}'.format(revision_id)]

にもかかわらず、同じ引数を送るには 2 つの方法があります。

4

2 に答える 2

2

あなたが尋ねたものの違い..簡単に確認できます:

arg = 'foo'

cmd = ['do', '--something', arg]
print cmd
cmd = ['do', '--someting {0}'.format(arg)]
print cmd

>>> 
['do', '--something', 'foo']
['do', '--someting foo']

ご覧のとおり、それらは同じではありません。

サブプロセスを正しく呼び出すには、次のようにする必要があります。

cmd = ['gs', '-dBATCH', '-dNOPAUSE', '-sDEVICE=pdfwrite', '-sOutputFile={0}'.format(pdf_filename), ps_filename]
subprocess.Popen(cmd, ...)

また:

cmd = 'gs -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile={0} {1}'.format(pdf_filename, ps_filename)
subprocess.Popen(cmd, shell=True, ...)

引数のリストまたは文字列の使用の違い:

引数のリストを使用する場合、それらを引数としてシェル (または指定した場合は実行可能ファイル) に渡します。

そして、文字列を送信するとshell=True、シェルに文字列を解析させ、独自の引数を作成させます...

引数['do', '--something', 'foo']は 3 つですが、引数['do', '--someting foo']は 2 つだけです。

于 2013-05-29T08:46:19.287 に答える