Python 2.7 每次循环返回值

Python 2.7 returning values each time through the loop

我正在做的是为 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

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

如有任何建议,我们将不胜感激,谢谢。

使用 yield 而不是 return 并将其移动到循环中,如下所示:

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

稍后您可以在 for 循环中使用创建的 generator(returns 和 yield 是其中之一的函数),例如:

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

你可以看看这个问题的一个很好的答案What does the "yield" keyword do in Python?

编辑:添加了方法的用法

在每次循环后 "return" 的答案是让出,但是最好让一个函数使用单个 ip 并迭代你的 ips:

def my_function(ip):
    new_data = dosomething
    return new_data

for ip in ips:
    result = my_function(ip)

此外,要使用 Nmap,您应该查看 python-nmap 这非常好。