【问题标题】:Pinging local IPs with python使用 python ping 本地 IP
【发布时间】:2021-06-13 09:33:25
【问题描述】:

我正在尝试编写一个函数来 ping 与 LAN 连接的多个 IP 地址到我的 PC

我是:

'''

def ping_ip (ip):

pingResponse = os.system("ping " + ip + " -n 1")

if pingResponse == 0:

    return "Pass"

else:

    return "Fail"

def ping_all_ips ():

global allIPs

for ip in allIPs:

    result = ping_ip(ip)

    print(f"Attempt To Ping {ip} -----> {result}")

'''

但问题是即使 IP 未连接我也会得到“通过”,因为它会将“来自 XXXX 的回复:无法访问目标网络”视为成功

编辑:尝试使用 subprocess 模块如下:

def ping_ip (ip):

    process = subprocess.Popen("ping " + ip + " -n 1" , shell=True stdoutt=subprocess.PIPE)

    for line in process.stdout:

        if b"Destination" in line or b"Request timed out" in line:

            return "Fail"

        else:

            return "Pass"

def ping_all_ips ():

    global allIPs

    for ip in allIPs:

        result = ping_ip(ip)

         print(f"Attempt To Ping {ip} -----> {result}")

if __name__ == '__main__':

    ping_all_ips()

【问题讨论】:

  • 您可以使用模块 subprocess.Popen() 而不是 os.system() 并捕获当前发送到终端的输出,然后检查它。

标签: python cmd ping


【解决方案1】:

我猜你的问题是你想检查控制台的输出,但可以看看如何。解决方案是像这样使用subprocess 模块。

import subprocess

allIPs = ["192.168.1.1", "192.168.1.203", "192.168.1.23"]
def ping_ip (ip):
     process = subprocess.Popen("ping " + ip , shell=True , stdout=subprocess.PIPE) 
     for line in process.stdout:
        print(line)
        if b"PING" in line:
            continue
        if b"Destination" in line or b"Request timed out" in line: 
            print("failed")
            process.kill()
            return "Fail"
        else:            
            print("passed")
            process.kill()
            return "Pass"
        
def ping_all_ips (): 
    global allIPs
    for ip in allIPs:
        print(f"Attempt To Ping {ip}") 
        result = ping_ip(ip)
        print(f"Attempt To Ping {ip} -----> {result}") 
if __name__ == '__main__': 
    ping_all_ips()

此代码将打开一个新进程来运行您的命令并检查每一行输出,如果它在输出中找到Destination,这意味着发生了错误,它将打印错误并终止进程。然后,如果一切正常,您可以添加您的逻辑,并记住始终终止该进程,因为 ping 如果不停止,将永远运行。

【讨论】:

  • 如果我只使用 ping -n 1,为什么我需要终止进程?或者这个模块不可能做到这一点?
  • @BenPinhas 你是对的我的意思是在我上面的代码示例中你必须杀死它但是因为你使用-n 1 进程将自行退出。
  • 我已经尝试过这个解决方案,但我每次 ping 尝试都通过了..
  • @BenPinhas 您是否复制并粘贴了上面的代码,因为它在我的机器上运行
  • 抱歉,它看起来有点乱,但我在手机上,我编辑了帖子以显示我的新代码
猜你喜欢
  • 2016-12-10
  • 1970-01-01
  • 2020-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-24
  • 2023-01-25
相关资源
最近更新 更多