【发布时间】:2016-03-31 12:00:09
【问题描述】:
我的问题更多的是理论而不是实际,我找到了更多解释如何而不是为什么我们应该在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 使用的列表模型可能都在某种程度上相关,但是谁能对此给出一个很好的解释?
提前致谢。
【问题讨论】:
-
这很方便,一方面。当您的参数包含一个空格和两种不同类型的引号时,需要相当多的时间才能将其放入字符串中,以便 Bash 将其视为一个参数。当它在列表中时,
Popen会为您处理。 -
顺便说一句,您通常不应该使用
subprocess.Popen()- 它在某些平台上的某些情况下恰好可以工作,但在一般情况下,它只是启动一个子进程,并且您需要几个额外的交互才能正确运行和关闭该过程。subprocess库中的包装器会处理这一点,并保护您免受底层复杂性的影响——只有当它们不足以满足您的需求时,您才应该转向底层的主力函数。在这种情况下,subprocess.call()将是首选工具。
标签: python subprocess execve