首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么` `print foo.communicate()[0]`不同于` `print foo.communicate()`“

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

Stack Overflow用户
提问于 2010-04-08 06:04:20
回答 2查看 689关注 0票数 1

情况是这样的:

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

代码语言:javascript
复制
import subprocess
foo = subprocess.Popen('ls /', shell=True, stdout=subprocess.PIPE,\
stderr=subprocess.STDOUT)

非常基础,对吧?我已经知道我可以用.communicate()对输出做一些事情,就像这样:

代码语言:javascript
复制
print foo.communicate()

它工作得很好,并生成subprocess.communicate文档建议的输出,即一个元组:

代码语言:javascript
复制
('bin\nboot\ncdrom\n[...stuff redacted for brevity...]tmp\nusr\nvar\nvmlinuz\n', None)

请注意其中的\n换行符。我发现,只要请求元组的第一个元素就会产生换行符的输出,如下所示:

代码语言:javascript
复制
>>> print foo.communicate()[0]
bin
boot
cdrom
[...stuff redacted for brevity...]
tmp
usr
var
vmlinuz

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

提前谢谢你,

--jed

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-04-08 06:13:46

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

例如,假设你有:

代码语言:javascript
复制
      >>> a = ('foo\nbar', '5')
      >>> print a
      ('foo\nbar', '5')

正如你所注意到的。但是如果你这样做的话:

代码语言:javascript
复制
      >>> class mytuple(tuple):
              def __str__(self):
                  return ''.join(self)
      >>> b = mytuple(a)
      >>> print b
      foo
      bar5

元组类型的这个子类超越了标准的__str__,它构建了一个由其组成部分的字符串表示组成的字符串。

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

票数 3
EN

Stack Overflow用户

发布于 2010-04-08 06:09:25

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2596261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档