9

我有 Python 子进程调用,它们被格式化为一系列参数(比如subprocess.Popen(['ls','-l'])而不是单个字符串(即subprocess.Popen('ls -l'))。

当像我一样使用序列参数时,有没有办法获取发送到 shell 的结果字符串(用于调试目的)?

一种简单的方法是我自己将所有论点结合在一起。但我怀疑这在所有情况下都与子进程所做的相同,因为使用序列的主要原因是'allow[s] the module to take care of any required escaping and quoting of arguments'

4

2 回答 2

18

如评论中所述,subprocess附带(未在文档页面中记录)list2cmdline将参数列表转换为单个字符串。根据源文档,list2cmdline主要在 Windows 上使用:

在 Windows 上:Popen 类使用 CreateProcess() 来执行子程序,该程序对字符串进行操作。如果 args 是一个序列,它将使用 list2cmdline 方法转换为字符串。请注意,并非所有 MS Windows 应用程序都以相同的方式解释命令行:list2cmdline 是为使用与 MS C 运行时相同规则的应用程序设计的。

不过,它在其他操作系统上非常有用。

编辑

如果您需要反向操作(,将命令行拆分为正确标记化参数的列表),您将需要使用该shlex.split函数,subprocess.

>>> help(subprocess.list2cmdline)
Help on function list2cmdline in module subprocess:

list2cmdline(seq)
    Translate a sequence of arguments into a command line
    string, using the same rules as the MS C runtime:

    1) Arguments are delimited by white space, which is either a
       space or a tab.

    2) A string surrounded by double quotation marks is
       interpreted as a single argument, regardless of white space
       contained within.  A quoted string can be embedded in an
       argument.

    3) A double quotation mark preceded by a backslash is
       interpreted as a literal double quotation mark.

    4) Backslashes are interpreted literally, unless they
       immediately precede a double quotation mark.

    5) If backslashes immediately precede a double quotation mark,
       every pair of backslashes is interpreted as a literal
       backslash.  If the number of backslashes is odd, the last
       backslash escapes the next double quotation mark as
       described in rule 3.
于 2012-08-26T12:49:37.120 回答
2

从 Python 3.8 开始,有一个shlex.join()函数:

>>> shlex.join(['ls', '-l'])
'ls -l'
于 2021-10-07T17:24:10.263 回答