gpt4 book ai didi

具有复杂参数的 Python 子进程

转载 作者:太空宇宙 更新时间:2023-11-04 07:21:36 24 4
gpt4 key购买 nike

我正在寻找从 python(3) 调用 shell 命令的最安全和最方便的方法。这是 ps 到 pdf 的转换:

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

我使用 subprocessshlex 并避免使用 shell=True。但我发现生成的命令不一致:

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

我错过了什么?! subprocess.call() 语法用空格分隔参数看起来很干净,在其他地方看起来很乱。

调用 subprocess.call(cmd)(在 python 级别,即转义、注入(inject)保护、引用等)之间有什么区别:

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)]

尽管如此,发送相同参数的方式却是两种。

最佳答案

区别在于该命令可能有一个接受参数的 --something 选项,但它没有 --something foo 选项 --就是你要告诉它的。当您在 shell 中运行命令时,例如 wc -l myfile.txt,您的 shell 会在找到空格的地方拆分该命令行 - 因此运行的命令是 ['wc' , '-l', 'myfile.txt']

subprocess 模块不执行这种拆分。您必须自己执行此操作(除非您使用“shell”选项,但这通常不太安全,因此请尽可能避免使用它。)。

一些反例...

尝试运行名为“wc -l myfile.txt”的命令。当然,没有安装“wc -l myfile.txt”命令,只有一个“wc”命令,所以这会失败:

['wc -l myfile.txt']

尝试使用选项“-l myfile.txt”运行命令“wc”。有一个“-l”选项,但没有“-l myfile.txt”选项。这将失败:

['wc', '-l myfile.txt']

和一个正确的例子:

['wc', '-l', 'myfile.txt']

这会调用带有 -l 选项的 wc(仅打印行数)和 myfile.txt 作为唯一的文件名。

您可能会发现令人困惑的是这样的片段:

'-sOutputFile={0}'

这是给出选项参数的“内联”样式。如果支持,程序的帮助通常会明确说明。 Python 不会拆分它们——接收它们的程序会拆分。

“内联”参数主要有三种样式。我将使用 grep 选项来演示前两个:

--context=3
-C3

(以上两行是等价的)

第三种类型仅存在于 imagemagick 和其他一些往往具有大量命令行参数的程序中,例如 gs:

-sOutputFile=foo

这只是上面显示的 GNU 标准 --long-option=VALUE 形式的一个小变化。

The GNU libc manual's "argument syntax" section给出了这些选项传递约定的完整解释。

  • 关于转义:不进行转义,通常也不需要转义。字符串值完全按照您指定的传递给命令。自然地,既不会也不需要引用,因为您已经在 Python 代码中处理了它。

  • 关于注入(inject):除非您使用“shell”选项,否则这是不可能的。 不要使用“shell”选项 :).

关于具有复杂参数的 Python 子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16809198/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com