2010-04-07 74 views
1

这里的情况是:为什么`打印foo.communicate()[0]``从打印foo.communicate不同()`”

我有我运行一个命令:

import subprocess 
foo = subprocess.Popen('ls /', shell=True, stdout=subprocess.PIPE,\ 
stderr=subprocess.STDOUT) 

非常基本的,正确的,我已经想通了,我可以做的东西与输出与.communicate(),像这样:

print foo.communicate() 

伟大的工程,并产生输出,对于subprocess.communicate文档建议我t应该是一个元组:

('bin\nboot\ncdrom\n[...stuff redacted for brevity...]tmp\nusr\nvar\nvmlinuz\n', None) 

请注意\n换行符在那里。而且我发现,只是在寻求元组的第一个元素产生输出用换行,像这样:

>>> print foo.communicate()[0] 
bin 
boot 
cdrom 
[...stuff redacted for brevity...] 
tmp 
usr 
var 
vmlinuz 

但我不明白的是为什么只有第一个元素印刷生产的换行。不要误解我的意思,这很棒,我很高兴我可以在没有循环的情况下做到这一点,但我想知道发生了什么。

由于提前,

--jed

回答

3

在Python中,当您调用类似print obj的东西时,实际上调用对象上的__str__,然后将结果解释为字符串。

因此,例如说你有:

 >>> a = ('foo\nbar', '5') 
     >>> print a 
     ('foo\nbar', '5') 

正如您所注意到。但是,如果你是这样的:

 >>> class mytuple(tuple): 
       def __str__(self): 
        return ''.join(self) 
     >>> b = mytuple(a) 
     >>> print b 
     foo 
     bar5 

元组类型的子类超出了标准__str__,并建立一个由出其组成部分的字符串表示字符串。

在一般情况下不这样做的原因是,您永远不知道可以在元组或列表中插入哪些对象 - 并非所有对象都具有可串行表示。

2

foo.communicate()返回tuple。如果您编写foo.communicate()[0],则检索该元组中的第一个元素。由于此元素只是一个字符串,因此python解释器会将其打印到屏幕上,并将其打印为\n作为换行符。

当您从foo.communinicate()打印元组时,您会看到\n个字符,但这只是元组打印方式的差异,换行符总是在那里。