【发布时间】:2016-12-29 02:57:16
【问题描述】:
在 Windows 上,您通过传递字符串参数列表来进行子进程调用,然后将其重新格式化为单个字符串以调用相关命令。它通过文档here 中概述的一系列规则来执行此操作。
在 Windows 上,一个 args 序列被转换为一个可以被 使用以下规则解析(对应于使用的规则 由 MS C 运行时):
- 参数由空格分隔,空格或空格 标签。
- 用双引号括起来的字符串被解释为 单个参数,而不考虑其中包含的空格。一个引用 字符串可以嵌入到参数中。
- 双引号 前面有反斜杠被解释为文字双引号 标记。
- 反斜杠按字面解释,除非它们立即 在双引号之前。
- 如果反斜杠紧接在 双引号,每对反斜杠都被解释为 文字反斜杠。如果反斜杠的数量是奇数,最后一个 反斜杠转义下一个双引号,如规则中所述
但是在实践中这可能很难正确,因为不清楚字符串是如何被解释的。在弄清楚如何正确格式化命令时可能会反复试验。
有没有一种方法可以确定要制定的字符串子流程?这样我就可以检查它并确保它的公式正确,并且比仅记录命令的列表形式更好地记录它。
【问题讨论】:
-
有些语言提供了一个选项让您自己指定字符串,而不是提供一个数组进行转换。我不确定 Python,但可能值得一试。
-
@HarryJohnston 在 Python 中,您可以使用名为
os.system的命令来有效地执行此操作。它接受一个字符串并将其直接传递给命令行。但是subprocess模块还有其他方法所缺乏的便利。 -
在the documention on
subprocess的行之间阅读我相信您会发现您可以将args 指定为字符串而不是序列。我刚刚尝试过这个(在 Anaconda 4.1.0 上,相当于 Python 2.7.11),它对我有用。
标签: python windows subprocess