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 这非常好。
我正在做的是为 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 这非常好。