为什么我们必须在 subprocess.Popen 中使用列表?

mva*_*rge 6 python subprocess execve

我的问题更多的是理论性而非实际性,我找到了更多的答案来解释我们如何在通话中使用列表,而不是为什么subprocess.Popen

例如众所周知:

Python 2.7.10 (default, Oct 14 2015, 16:09:02)
[GCC 5.2.1 20151010] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import subprocess
>>> cmd = subprocess.Popen(["python", "-V"], stdout=subprocess.PIPE)
Python 2.7.10
Run Code Online (Sandbox Code Playgroud)

然后我在UNIX上乱搞,发现了一些有趣的东西:

mvarge@ubuntu:~$ strace -f python -V 2>&1
execve("/usr/bin/python", ["python", "-V"], [/* 29 vars */]) = 0
Run Code Online (Sandbox Code Playgroud)

可能两者execve和使用的列表模型subprocess都有某种相关性,但是任何人都可以对此给出一个很好的解释吗?

提前致谢。

tri*_*eee 4

底层的 C 级表示是一个*char []数组。在 Python 中将其表示为列表只是一种非常自然且透明的映射。

您可以使用字符串而不是带有shell=True;的列表。然后 shell 负责将命令行解析为* char []数组。然而,shell 增加了一些令人讨厌的复杂性;请参阅许多关于为什么要避免的shell=True问题以获取详细说明。

命令行参数argv和环境envp只是许多操作系统级结构中的两个,它们本质上是一个以 null 结尾的字符串数组。