Python 2.7每次循环返回值

时间:2016-04-15 19:28:55

标签: python python-2.7 nmap

我正在做的是为nmap指定一系列IP地址,比如说(192.168.0.0-50),扫描它扫描的每个IP我需要在不同的函数中使用输出。

以下是我正在做的一些代码:

def revLookup(ips):
    revCmd = "nmap -R -sP " + ips
    revargs = shlex.split(revCmd)
    revOut = subprocess.Popen(revargs, shell=False, stdout=subprocess.PIPE)
    for rline in revOut.stdout:
        if "Nmap scan report for " in rline:
            nmapNmIp = rline.strip("Nmap scan report for")
            rname, rip = nmapNmIp.split(" ")[0], nmapNmIp.split(" ")[-1]
            if rname.strip() == rip.strip():
                rname = "NO Name Provided"
            revNmapName = rname.split('.', 1)[0]
            rip = re.sub('[\(\)]', '', rip.strip())
        elif "MAC Address: " in rline:
            rnmapmac = rline.split(': ', 1)[-1]
            rnmapmac = rnmapmac.split(" ")[0]

    return revNmapName, rip, rnmapmac

返回的值只是列表中的最后一个值。 我有其他函数使用各种值来创建其他信息,但我需要逐个生成这些。我可以这样做,如果我创建一个长杂乱的功能,我知道这不是正确的方法。

感谢任何建议。

2 个答案:

答案 0 :(得分:1)

使用yield代替return并将其移动到循环中,如下所示:

for rline in revOut.stdout:
    if "Nmap scan report for " in rline:
        ...
    elif "MAC Address: " in rline:
        ...
    yield revNmapName, rip, rnmapmac

稍后您可以在for循环中使用创建的生成器(以yield返回的函数之一),例如:

for rev, rip, rnmap in revLookup(ips):
    print rev, rip, rnmap

您可以查看此问题的完美答案What does the "yield" keyword do in Python?

编辑:添加了方法的用法

答案 1 :(得分:0)

每次循环后“返回”的答案都是屈服,但是使用单个ip并迭代你的ips可能会更好一些函数:

def my_function(ip):
    new_data = dosomething
    return new_data

for ip in ips:
    result = my_function(ip)

另外,对于使用Nmap,你应该看看python-nmap这是非常好的。