2010-04-07 30 views
0

的Python:元组转换为鉴于这样的字符串

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's被剥离......但是怎么样?

回答

6

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

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

1

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

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

尝试将您的print声明更改为print repr(result),您会看到。

+0

如果'__str __()'可用,'print'不使用'__repr __()',但标准序列类型使用'__repr __()'打印它们的元素。 – 2010-04-07 11:48:41

4

在这两种情况下,cl.communicate()都会返回一个两元素元组(命令的标准输出和标准错误,如果stdout和stderr都重定向到PIPE)。在第一种情况下,您将此元组分配给result变量。当你打印它时,你会得到元组的文本表示。在这种表示中,特殊字符(如行尾)被转义(转换为'\ n')。

在第二种情况下,你解开元组。这意味着:将元组的第一个元素指定为result,将第二个元素指定为err。因为result已经是一个字符串,所以它不会被转义 - 行尾字符显示为换行符而不是'\ n'。

+1

+1 - 很好的解释 – cit 2010-04-07 12:19:35