如何确定传递给命令行的字符串子进程?

时间:2016-08-22 14:00:00

标签: python windows subprocess

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

  

在Windows上,args序列转换为可以的字符串   使用以下规则解析(对应于使用的规则)   通过MS C运行时):

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

然而在实践中,这可能很难做到,因为它不清楚字符串是如何被解释的。在确定如何正确格式化命令时可能会出现反复试验。

有没有办法可以确定哪个字符串子进程会形成?这样我就可以检查它并确保它的正确配置以及记录它比记录命令的列表形式更好。

1 个答案:

答案 0 :(得分:3)

我挖到了实际的子进程模块,并在那里找到了答案。有一个名为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'