2010-04-07 59 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