我正在寻找从 python(3) 调用 shell 命令的最安全、最方便的方法。这是一个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)]
尽管如此,这是发送相同参数的两种方式。