鉴于此:
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()返回此元组:
^{pr2}$将方法中的第二行更改为
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的被剥离。。。。但是怎么做呢?在
{tuple}仍然返回result, err = ...具有将元组解包到变量}(整数)中的效果。在
result
(字符串)和{打印元组时,它使用每个元素的
repr(...)
,但当打印字符串时,它只打印字符串,因此没有分隔符和\n
s在这两种情况下,
cl.communicate()
返回一个双元素元组(如果stdout和stderr都重定向到管道,则返回命令的stdout和stderr)。在第一种情况下,将这个元组赋给result
变量。当您打印它时,您将得到元组的文本表示。在这种表示中,特殊字符(如行尾)被转义(到'\n')。在在第二种情况下,解包元组。这意味着:将元组的第一个元素分配给
result
,将第二个元素分配给err
。由于result
已经是一个字符串,因此打印时没有转义–行尾字符显示为换行符而不是'\n'。在print
很聪明。如果你给它一个字符串,它就会打印出来。如果您向它传递其他东西(本例中是元组),那么它将打印它的表示形式(由repr()
返回)。在字符串的表示有
\n
,其中字符串包含新行。这个表示法也有引号。在尝试将您的
print
语句更改为print repr(result)
,您将看到。在相关问题 更多 >
编程相关推荐