子流程模块具有便利功能call
,这是在两个2.6和3.1实现这样的:为什么python的subprocess.call像这样实现?
def call(*popenargs, **kwargs):
return Popen(*popenargs, **kwargs).wait()
此函数的文档携带红色警告,内容如下:
警告 :与
Popen.wait()
类似,当使用stdout=PIPE
和/或stderr=PIPE
时,此过程会发生死锁,并且子进程会向管道生成足够的输出,从而阻止等待OS管道缓冲区接受更多数据。
Popen.wait()
文档说在这种情况下使用Popen.communicate()
。那么,为什么不是call
只是像下面的实现,所以愚蠢的警告可以被删除,像这样的愚蠢限制从标准库中删除?
def call(*args, **kwargs):
input = kwargs.pop("input", None)
p = Popen(*args, **kwargs)
p.communicate(input)
return p.returncode
我确定有一个原因。我错过了什么?
控制程序的输出是使用stdout = PIPE和stderr = PIPE的共同点。也就是,相当于'command>/dev/null 2>&1'的python,然后在bash中检查'$?'。 – 2011-03-04 15:33:37
'stdout = open('/ dev/null','w'),stderr = STDOUT'会更好吗? – 2011-03-04 15:48:23
@Baffe我想,但重点是,有一个理由使用'call'的stdout =和stderr =关键字参数。 – 2011-03-04 15:53:08