我的问题是理论性的而不是实践性的,我找到了更多的答案来解释我们应该如何而不是为什么在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
只是许多操作系统级结构中的两个,本质上是以空结尾的字符串数组。