如何获得导致子命令字符串(How to get resulting subprocess comma

2019-09-21 16:35发布

我具有被格式化为自变量的序列(如Python子过程调用subprocess.Popen(['ls','-l'])而不是一个单一的字符串(即subprocess.Popen('ls -l')

当使用排序参数,像我一样,有没有办法让被发送到外壳程序(用于调试)生成的字符串?

一个简单的方法是加入所有参数一起自己。 但我怀疑这会在所有情况下是相同的什么子呢,因为使用序列中的主要原因是为了“让[S]照顾的任何模块所需的逃逸和参数报价” 。

Answer 1:

作为在评论中提及, 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.


文章来源: How to get resulting subprocess command string