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
但我不明白的是,为什么只使用第一个元素打印就会产生换行符。别误会我的意思,这很好,我很高兴我能做到这一点,而不是一个循环,但我想了解发生了什么
提前感谢,
--jedfoo.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
,构建了一个由其组成部分的字符串表示组成的字符串
在一般情况下不这样做的原因是,您永远不知道可以在元组或列表中插入哪些对象-并非所有对象都具有可用于字符串的表示