【问题标题】:How to determine what string subprocess is passing to the commandline?如何确定传递给命令行的字符串子进程?
【发布时间】:2016-12-29 02:57:16
【问题描述】:

在 Windows 上,您通过传递字符串参数列表来进行子进程调用,然后将其重新格式化为单个字符串以调用相关命令。它通过文档here 中概述的一系列规则来执行此操作。

在 Windows 上,一个 args 序列被转换为一个可以被 使用以下规则解析(对应于使用的规则 由 MS C 运行时):

  1. 参数由空格分隔,空格或空格 标签。
  2. 用双引号括起来的字符串被解释为 单个参数,而不考虑其中包含的空格。一个引用 字符串可以嵌入到参数中。
  3. 双引号 前面有反斜杠被解释为文字双引号 标记。
  4. 反斜杠按字面解释,除非它们立即 在双引号之前。
  5. 如果反斜杠紧接在 双引号,每对反斜杠都被解释为 文字反斜杠。如果反斜杠的数量是奇数,最后一个 反斜杠转义下一个双引号,如规则中所述

但是在实践中这可能很难正确,因为不清楚字符串是如何被解释的。在弄清楚如何正确格式化命令时可能会反复试验。

有没有一种方法可以确定要制定的字符串子流程?这样我就可以检查它并确保它的公式正确,并且比仅记录命令的列表形式更好地记录它。

【问题讨论】:

  • 有些语言提供了一个选项让您自己指定字符串,而不是提供一个数组进行转换。我不确定 Python,但可能值得一试。
  • @HarryJohnston 在 Python 中,您可以使用名为 os.system 的命令来有效地执行此操作。它接受一个字符串并将其直接传递给命令行。但是subprocess 模块还有其他方法所缺乏的便利。
  • the documention on subprocess 的行之间阅读我相信您会发现您可以将args 指定为字符串而不是序列。我刚刚尝试过这个(在 Anaconda 4.1.0 上,相当于 Python 2.7.11),它对我有用。

标签: python windows subprocess


【解决方案1】:

我深入研究了实际的子流程模块,实际上在那里找到了答案。有一个名为list2cmdline 的函数,用于获取传递给Popen 的列表并将其转换为单个命令行参数字符串。只需使用列表调用它即可获得我需要的结果:

import subprocess

name = "Monty Python's Flying Circus"
path = r"C:\path\to\files"
subprocess.list2cmdline(["file.py", name, path])
# 'file.py "Monty Python\'s Flying Circus" C:\\path\\to\\files'

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-18
  • 1970-01-01
  • 2016-03-08
相关资源
最近更新 更多