Python: преобразование кортежа в строку - PullRequest
0 голосов
/ 07 апреля 2010

Учитывая это:

import os
import subprocess

def check_server():

    cl = subprocess.Popen(["nmap","10.7.1.71"], stdout=subprocess.PIPE)
    result = cl.communicate()
    print result

check_server()

check_server () возвращает этот кортеж:

('\nStarting Nmap 4.53 ( http://insecure.org ) at 2010-04-07 07:26 EDT\nInteresting ports on 10.7.1.71:\nNot shown: 1711 closed ports\nPORT   STATE SERVICE\n21/tcp open  ftp\n22/tcp open  ssh\n80/tcp open  http\n\nNmap done: 1 IP address (1 host up) scanned in 0.293 seconds\n', None)

Изменение второй строки метода на

result, err = cl.communicate()

приводит к возврату check_server ():

Starting Nmap 4.53 ( http://insecure.org ) at 2010-04-07 07:27 EDT
Interesting ports on 10.7.1.71:
Not shown: 1711 closed ports
PORT   STATE SERVICE
21/tcp open  ftp
22/tcp open  ssh
80/tcp open  http

Nmap done: 1 IP address (1 host up) scanned in 0.319 seconds

Выглядит так, что кортеж преобразуется в строку, а \ n удаляются .... но как?

Ответы [ 3 ]

6 голосов
/ 07 апреля 2010

cl.communicate() все еще возвращает кортеж. Назначение result, err = ... приводит к распаковке кортежа в переменные result (строка) и err (целое число).

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

4 голосов
/ 07 апреля 2010

В обоих случаях cl.communicate() возвращает двухэлементный кортеж (stdout и stderr команды, если и stdout, и stderr перенаправлены в PIPE) В первом случае вы назначаете этот кортеж переменной result. Когда вы печатаете его, вы получаете текстовое представление кортежа. В таком представлении специальные символы, такие как конец строки, экранируются (в '\ n').

Во втором случае вы распаковываете кортеж. Это означает: вы назначаете первый элемент кортежа на result, а второй на err. Поскольку result уже является строкой, она печатается без экранирования - символы конца строки отображаются как разрывы строк, а не '\ n'.

1 голос
/ 07 апреля 2010

print умный. Если вы передаете ему строку, она просто печатает. Если вы передадите ему что-то еще (кортеж в этом примере), то он напечатает его представление (возвращаемое repr()).

Представление строки имеет \n, где строка содержит символы новой строки. В представлении также есть кавычки.

Попробуйте изменить выражение print на print repr(result), и вы увидите.

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