为什么`print foo.communicate()[0]`与`print foo.communicate()`“不同?

时间:2010-04-07 22:04:20

标签: python

情况如下:

我有一个正在运行的命令:

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

非常基本,对吗?而且我已经发现我可以使用.communicate()对输出进行处理,如下所示:

print foo.communicate()

哪个很好用,并产生subprocess.communicate文档建议应该输出的输出,一个元组:

('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

2 个答案:

答案 0 :(得分: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__,并构建了一个由其组成部分的字符串表示组成的字符串。

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

答案 1 :(得分:2)

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

当您从foo.communinicate()打印元组时,您会看到\n个字符,但这只是元组打印方式的不同,换行始终存在。