Python 为什么“print foo.communicate()[0]”与“print foo.communicate()”`;

Python 为什么“print foo.communicate()[0]”与“print foo.communicate()”`;,python,Python,情况如下: 我正在运行一个命令: import subprocess foo = subprocess.Popen('ls /', shell=True, stdout=subprocess.PIPE,\ stderr=subprocess.STDOUT) 很基本,对吧?我发现我可以用.communicate()处理输出,如下所示: print foo.communicate() >>> print foo.communicate()[0] bin boot cdrom [

情况如下:

我正在运行一个命令:

import subprocess
foo = subprocess.Popen('ls /', shell=True, stdout=subprocess.PIPE,\
stderr=subprocess.STDOUT)
很基本,对吧?我发现我可以用
.communicate()
处理输出,如下所示:

print foo.communicate()
>>> print foo.communicate()[0]
bin
boot
cdrom
[...stuff redacted for brevity...]
tmp
usr
var
vmlinuz
这非常有效,并产生subprocess.communicate文档所建议的输出,一个元组:

('bin\nboot\ncdrom\n[...stuff redacted for brevity...]tmp\nusr\nvar\nvmlinuz\n', None)
注意这里的
\n
换行符。我发现只要请求元组的第一个元素,就会产生换行输出,如下所示:

print foo.communicate()
>>> print foo.communicate()[0]
bin
boot
cdrom
[...stuff redacted for brevity...]
tmp
usr
var
vmlinuz
但我不明白的是,为什么只使用第一个元素打印就会产生换行符。别误会我的意思,这很好,我很高兴我能做到这一点,而不是一个循环,但我想了解发生了什么

提前感谢,

--jed

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

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

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


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

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

比如说你有:

      >>> 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
元组类型的这个子类超越了标准的
\uuuu str\uuuu
,构建了一个由其组成部分的字符串表示组成的字符串


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

在Python中,当您调用类似于
print obj
的对象时,实际上,您正在调用对象上的
\uuu str\uu
,然后将结果解释为字符串

比如说你有:

      >>> 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
元组类型的这个子类超越了标准的
\uuuu str\uuuu
,构建了一个由其组成部分的字符串表示组成的字符串

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