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

标签 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

然后在UNIX里瞎折腾,发现了一个有趣的东西:

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

可能 execvesubprocess 使用的列表模型在某种程度上是相关的,但是谁能对此给出一个很好的解释?

提前致谢。

最佳答案

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

您可以使用字符串而不是列表,shell=True;然后 shell 负责将命令行解析为 * char [] 数组。但是,shell 增加了许多讨厌的复杂性;查看关于 why you want to avoid shell=True 的许多问题以获得详细的解释。

command line arguments argv and the environment envp只是许多操作系统级结构中的两个,这些结构本质上是一个以 null 结尾的字符串数组。

关于python - 为什么我们必须在 subprocess.Popen 中使用列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36332873/

相关文章:

python - 通过 python IMAP 使用消息 ID 检索/搜索电子邮件

Python 调用 svn di 时的 call() 行为不正确

c - Linux下共享内存映射

c - 从 C 内存中加载脚本

java - 阻止java程序打开线程

Python Mechanize 更改未命名的输入值(已知 id)

python - 使用 cython 将模块移植到 python 3.1

python - 以附加模式将子进程输出转储到文件中

python - 无法使用 popen 重定向 IO

python - 在文本文件中找不到字符串