鉴于此:
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被剥离....但是怎么样?
答案 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)
,您会看到。