情况是这样的:
我有一个正在运行的命令:
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
发布于 2010-04-08 06:13:46
在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__,它构建了一个由其组成部分的字符串表示组成的字符串。
在一般情况下不这样做的原因是,您永远不知道可以在元组或列表中插入什么对象-并不是所有的对象都有字符串表示。
发布于 2010-04-08 06:09:25
foo.communicate()返回一个tuple。如果编写foo.communicate()[0],您将检索元组中第一个元素。由于该元素只是一个字符串,python解释器会将其打印到屏幕上,并将\n打印为换行符。
当您从foo.communinicate()打印元组时,您会看到\n字符,但这只是打印元组的方式的不同,换行符始终在那里。
https://stackoverflow.com/questions/2596261
复制相似问题