2010-04-07 79 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個字符,但這只是元組打印方式的差異,換行符總是在那裏。