我的问题比实际更理论化,我找到了更多解释如何但不是为什么我们应该在 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
可能 execve
和 subprocess
使用的列表模型在某种程度上是相关的,但是谁能对此给出一个很好的解释?
提前致谢。
最佳答案
底层的 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/