Почему `print foo.communicate () [0]` отличается от `print foo.communicate ()` " - PullRequest
1 голос
/ 08 апреля 2010

Вот ситуация:

У меня есть команда, которую я выполняю:

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

Но я не понимаю, ПОЧЕМУ печать только с первым элементом приводит к переводу строки. Не поймите меня неправильно, это здорово, и я рад, что могу сделать это без петли, но я бы хотел понять, что происходит.

Заранее спасибо,

- Джед

Ответы [ 2 ]

3 голосов
/ 08 апреля 2010

В 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 голосов
/ 08 апреля 2010

foo.communicate() возвращает tuple. Если вы напишите foo.communicate()[0], вы получите первый элемент в этом кортеже. Поскольку этот элемент является просто строкой, интерпретатор Python выводит его на экран, печатая \n в виде символов новой строки.

Когда вы печатаете кортеж из foo.communinicate(), вы видите \n символов, но это только различие в способе печати кортежей, новые строки всегда там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...