输出子进程调用的命令行?

Bri*_*tow 45 python command-line subprocess popen

我正在使用这个subprocess.Popen调用,在另一个问题中,我发现我误解了Python是如何为命令行生成参数的.

我的问题
有没有办法找出实际的命令行是什么?

示例代码: -

proc = subprocess.popen(....)
print "the commandline is %s" % proc.getCommandLine()
Run Code Online (Sandbox Code Playgroud)

你会怎么写getCommandLine

unu*_*tbu 61

这取决于您使用的Python版本.在Python3.3中,arg保存在proc.args:

proc = subprocess.Popen(....)
print("the commandline is {}".format(proc.args))
Run Code Online (Sandbox Code Playgroud)

在Python2.7,args没有保存,它只是传递到其他功能,如_execute_child.因此,在这种情况下,获取命令行的最佳方法是在拥有它时保存它:

proc = subprocess.Popen(shlex.split(cmd))
print "the commandline is %s" % cmd
Run Code Online (Sandbox Code Playgroud)

请注意,如果您有参数列表(例如返回的事物类型shlex.split(cmd),则可以cmd使用未记录的函数恢复命令行字符串subprocess.list2cmdline:

In [14]: import subprocess

In [15]: import shlex

In [16]: cmd = 'foo -a -b --bar baz'

In [17]: shlex.split(cmd)
Out[17]: ['foo', '-a', '-b', '--bar', 'baz']

In [18]: subprocess.list2cmdline(['foo', '-a', '-b', '--bar', 'baz'])
Out[19]: 'foo -a -b --bar baz'
Run Code Online (Sandbox Code Playgroud)


Bri*_*tow 7

我的问题的正确答案实际上是没有命令行。子进程的要点是它通过 IPC 完成所有事情。list2cmdline 的表现与预期的一样接近,但实际上最好的做法是查看“args”列表,并且只知道这将是被调用程序中的 argv 。

  • [`list2cmdline()`](https://hg.python.org/cpython/file/f38489a3394f/Lib/subprocess.py#l541) 仅在 Windows 上适用于与 MSC 运行时解析命令行方式兼容的应用程序。它将参数列表转换为传递给“CreateProcess()”的字符串。[`cmd.exe` 使用不同的规则](http://stackoverflow.com/q/27864103/4279)。在 POSIX 上,列表直接传递给 `os.execve()` (+/- os.fsencode())。 (4认同)