使用Python发送多个ping

使用Python发送多个ping,python,Python,我怎样才能同时ping192.168.0.1-192.168.0.254?尝试使脚本运行得更快,因为它需要几分钟才能完成 import os import subprocess ip = raw_input("IP Address? ") print "Scanning IP Address: " + ip subnet = ip.split(".") FNULL = open(os.devnull, 'w') for x in range(1, 255): ip2 = sub

我怎样才能同时ping
192.168.0.1
-
192.168.0.254
?尝试使脚本运行得更快,因为它需要几分钟才能完成

import os
import subprocess


ip = raw_input("IP Address? ")
print "Scanning IP Address: " + ip

subnet = ip.split(".")

FNULL = open(os.devnull, 'w')

for x in range(1, 255):
    ip2 = subnet[0]+"."+ subnet[1] +"."+ subnet[2] +"."+ str(x)
    response=subprocess.Popen(["ping", "-c", "1", "-n", "-W", "2", ip2], stdout=FNULL, stderr=subprocess.STDOUT).wait()
if response == 0:
    print ip2, 'is up!'
else:
    print ip2, 'is down!'

不必等待循环中的每个进程完成,您可以一次启动所有进程并将其保存在列表中:

processes = []

for x in range(1, 255):
    ip2 = subnet[0]+"."+ subnet[1] +"."+ subnet[2] +"."+ str(x)
    process = subprocess.Popen(["ping", "-c", "1", "-n", "-W", "2", ip2], stdout=FNULL, stderr=subprocess.STDOUT)
    processes.append((ip2, process))
然后,您可以等待每个过程完成并打印结果:

for ip2, process in processes:
    response = process.wait()
    if response == 0:
        print ip2, 'is up!'
    else:
        print ip2, 'is down!'

查看您用于获取响应的方法:

response=subprocess.Popen(["ping", "-c", "1", "-n", "-W", "2", ip2], stdout=FNULL, stderr=subprocess.STDOUT).wait()
最重要的是,结尾处的
.wait()
表示程序将等待进程完成

通过将Popen(而不是等待)的结果放入列表中,您可以一次启动255个进程(尽管出于理智考虑,您可能希望启动较小的块):

processes = []
for ip8 in range(1, 255):
    ip32 = subnet[0]+"."+ subnet[1] +"."+ subnet[2] +"."+ str(ip8)
    process = subprocess.Popen(["ping", "-c", "1", "-n", "-W", "2", ip32], stdout=FNULL, stderr=subprocess.STDOUT)
    processes.append(process)
然后,您可以完成每个过程,并等待它们完成:

for process, ip8 in zip(processes, range(1, 255)):
    ip32 = subnet[0]+"."+ subnet[1] +"."+ subnet[2] +"."+ str(ip8)
    response = process.wait()
    if response == 0:
        print("%s is up!" % (ip32))
    else:
        print("%s is down!" % (ip32))

或者,您可以对子网广播地址进行一次ping,将它们全部ping。因此,如果您的子网是
255.255.255.0
(也称为
/24
),则只需ping
192.168.0.255
,通常每个人都会ping回来

查看
multiprocessing
module的
Pool
@jacob multiprocessing的Pool不适合您启动和协调一组python进程吗?代码已经在启动进程(Popen就是这么做的),所以您只需要启动进程来启动进程,这会很快变得有趣。@Pyonsuke-Yeah;但他每次都在呼叫
等待
。使用
多处理
可以为每个
子进程启动一个进程。Popen
每个进程都可以有自己的
等待
。不是说它是最优的,但这是我想到的第一件事。远远不是最优的,在总共511个进程中,您将同时启动256个Python实例和255个ping实例。。我有点好奇,一个系统是否能正确处理这个问题。尽管您可能会考虑线程模块,它在同一进程内创建“线程”(例如,不使用多个内核,但由于这是IO绑定的,所以不必使用),但即使这样也有点过分,因为最终,Popen已经开始了一个进程,因此已经有效地开始了“线程”,您可以同时使用.poll()和.wait()