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

问题描述 投票:0回答:2

情况是这样的:

我正在运行一个命令:

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

但我不明白的是为什么仅使用第一个元素打印会产生换行符。不要误会我的意思,这很棒,我很高兴我可以在没有循环的情况下完成它,但我想了解发生了什么。

python subprocess
2个回答
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
字符,但这只是元组打印方式的差异,换行符始终存在。

© www.soinside.com 2019 - 2024. All rights reserved.