Python:将元组转换为字符串

时间:2010-04-07 11:39:06

标签: python string tuples

鉴于此:

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 个答案:

答案 0 :(得分:6)

cl.communicate()仍在返回一个元组。赋值result, err = ...具有将元组解包为变量result(字符串)和err(整数)的效果。

当你打印元组时,它使用每个元素的repr(...),但是当你打印字符串时,它只打印字符串,因此没有分隔符和\n s。

答案 1 :(得分:4)

在两种情况下cl.communicate()都返回一个双元素元组(如果stdout和stderr都被重定向到PIPE,则返回命令的stdout和stderr)。在第一种情况下,您将此元组分配给result变量。打印时,您将获得元组的文本表示。特殊字符(如行尾)以这种表示形式转义(到'\ n')。

在第二种情况下,你打开元组的包装。这意味着:您将元组的第一个元素分配给result,将第二个元素分配给err。由于result已经是一个字符串,因此打印时没有转义 - 行尾字符显示为换行符而不是'\ n'。

答案 2 :(得分:1)

print很聪明。如果你传递一个字符串,它只是打印它。如果你传递了其他东西(在这个例子中是一个元组),那么它会打印出它的表示(由repr()返回)。

字符串的表示形式为\n,其中字符串包含换行符。该表示也有引号。

尝试将print语句更改为print repr(result),您会看到。