我具有被格式化为自变量的序列(如Python子过程调用subprocess.Popen(['ls','-l'])
而不是一个单一的字符串(即subprocess.Popen('ls -l')
当使用排序参数,像我一样,有没有办法让被发送到外壳程序(用于调试)生成的字符串?
一个简单的方法是加入所有参数一起自己。 但我怀疑这会在所有情况下是相同的什么子呢,因为使用序列中的主要原因是为了“让[S]照顾的任何模块所需的逃逸和参数报价” 。
我具有被格式化为自变量的序列(如Python子过程调用subprocess.Popen(['ls','-l'])
而不是一个单一的字符串(即subprocess.Popen('ls -l')
当使用排序参数,像我一样,有没有办法让被发送到外壳程序(用于调试)生成的字符串?
一个简单的方法是加入所有参数一起自己。 但我怀疑这会在所有情况下是相同的什么子呢,因为使用序列中的主要原因是为了“让[S]照顾的任何模块所需的逃逸和参数报价” 。
作为在评论中提及, 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.