用于测试 ping 的 Python 函数

Posted

技术标签:

【中文标题】用于测试 ping 的 Python 函数【英文标题】:Python Function to test ping 【发布时间】:2014-12-15 14:41:12 【问题描述】:

我正在尝试创建一个可以定时调用的函数,以检查是否有良好的 ping 并返回结果,以便更新屏幕显示。我是 python 新手,所以我不完全了解如何在函数中返回值或设置变量。

这是我的有效代码:

import os
hostname = "google.com"
response = os.system("ping -c 1 " + hostname)
if response == 0:
    pingstatus = "Network Active"
else:
    pingstatus = "Network Error"

这是我创建函数的尝试:

def check_ping():
    hostname = "google.com"
    response = os.system("ping -c 1 " + hostname)
    # and then check the response...
    if response == 0:
        pingstatus = "Network Active"
    else:
        pingstatus = "Network Error"

这是我显示pingstatus的方式:

label = font_status.render("%s" % pingstatus, 1, (0,0,0))

所以我正在寻找的是如何从函数中返回 pingstatus。任何帮助将不胜感激。

【问题讨论】:

...return pingstatus? 要了解如何调用函数和返回值,我推荐Python Tutorial。 起初我打算建议一个纯 Python 方案(无需对底层操作系统进行炮击),但后来我在另一个线程中看到了麻烦/痛苦:***.com/questions/2953462/pinging-servers-in-python 【参考方案1】:
import platform
import subprocess

def myping(host):
parameter = '-n' if platform.system().lower()=='windows' else '-c'

command = ['ping', parameter, '1', host]
response = subprocess.call(command)

if response == 0:
    return True
else:
    return False
    
print(myping("www.google.com"))

【讨论】:

【参考方案2】:

此函数将测试给定重试次数的 ping,如果可达则返回 True,否则返回 False -

def ping(host, retry_packets):
    """Returns True if host (str) responds to a ping request."""

    # Option for the number of packets as a function of
    param = '-n' if platform.system().lower() == 'windows' else '-c'

    # Building the command. Ex: "ping -c 1 google.com"
    command = ['ping', param, str(retry_packets), host]
    return subprocess.call(command) == 0

# Driver Code
print("Ping Status : ".format(ping(host="xx.xx.xx.xx", retry_packets=2)))

输出:

Pinging xx.xx.xx.xx with 32 bytes of data:
Reply from xx.xx.xx.xx: bytes=32 time=517ms TTL=60
Reply from xx.xx.xx.xx: bytes=32 time=490ms TTL=60

Ping statistics for xx.xx.xx.xx:
     Packets: Sent = 2, Received = 2, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
     Minimum = 490ms, Maximum = 517ms, Average = 503ms
Ping Status : True

注意:xx.xx.xx.xx更改为您的IP

【讨论】:

【参考方案3】:

除了其他答案,您可以检查操作系统并决定是使用“-c”还是“-n”:

import os, platform
host = "8.8.8.8"
os.system("ping " + ("-n 1 " if  platform.system().lower()=="windows" else "-c 1 ") + host)

这适用于 Windows、OS X 和 Linux

你也可以使用sys:

import os, sys
host = "8.8.8.8"
os.system("ping " + ("-n 1 " if  sys.platform().lower()=="win32" else "-c 1 ") + host)

【讨论】:

我已将您的想法添加到我的答案中,并为您的好主意表示赞赏。 subprocess.check_output(["ping", "-n" if platform.system().lower()=="windows" else "-c", "1", host])【参考方案4】:

您似乎想要return 关键字

def check_ping():
    hostname = "taylor"
    response = os.system("ping -c 1 " + hostname)
    # and then check the response...
    if response == 0:
        pingstatus = "Network Active"
    else:
        pingstatus = "Network Error"

    return pingstatus

您需要在变量中捕获/“接收”函数的返回值(pingstatus),例如:

pingstatus = check_ping()

注意:ping -c 用于 Linux,Windows 使用 ping -n

关于python函数的一些信息:

http://www.tutorialspoint.com/python/python_functions.htm

http://www.learnpython.org/en/Functions

可能值得阅读一个很好的 Python 入门教程,它将涵盖所有基础知识。我建议调查Udacity.com 和codeacademy.com

【讨论】:

使用此代码我得到“NameError: name 'pingstatus' is not defined” @user72055 虽然check_ping 现在返回一个结果,但您仍然需要通过将其分配给一个变量来捕获该结果,然后才能访问该值:pingstatus = check_ping() 这在 Windows 上不起作用。有关多平台解决方案,请参阅 ePi272314 或 Pikamander2's 答案。 代码有错误。 pingstatus 必须在 if 块之前声明。把这一行放在那里:pingstatus = None @Shtefan 对不起,这是不正确的。看看这个:***.com/questions/58872704/…【参考方案5】:

这是我的检查 ping 功能版本。可能对某人有用:

def check_ping(host):
if platform.system().lower() == "windows":
response = os.system("ping -n 1 -w 500 " + host + " > nul")
if response == 0:
return "alive"
else:
return "not alive"
else:
response = os.system("ping -c 1 -W 0.5" + host + "> /dev/null")
if response == 1:
return "alive"
else:
return "not alive"

【讨论】:

Python 需要缩进才能正常工作,而这篇文章似乎失去了缩进。【参考方案6】:

试试这个

def ping(server='example.com', count=1, wait_sec=1):
    """

    :rtype: dict or None
    """
    cmd = "ping -c  -W  ".format(count, wait_sec, server).split(' ')
    try:
        output = subprocess.check_output(cmd).decode().strip()
        lines = output.split("\n")
        total = lines[-2].split(',')[3].split()[1]
        loss = lines[-2].split(',')[2].split()[0]
        timing = lines[-1].split()[3].split('/')
        return 
            'type': 'rtt',
            'min': timing[0],
            'avg': timing[1],
            'max': timing[2],
            'mdev': timing[3],
            'total': total,
            'loss': loss,
        
    except Exception as e:
        print(e)
        return None

【讨论】:

【参考方案7】:

这是一个简化的函数,它返回一个布尔值并且没有输出推送到标准输出:

import subprocess, platform
def pingOk(sHost):
    try:
        output = subprocess.check_output("ping - 1 ".format('n' if platform.system().lower()=="windows" else 'c', sHost), shell=True)

    except Exception, e:
        return False

    return True

【讨论】:

以上是关于用于测试 ping 的 Python 函数的主要内容,如果未能解决你的问题,请参考以下文章

python实战系列之批量主机ping网络测试(07)

Python:在做任何事情之前进行 Ping 测试

python 用于循环,ping,文件检查,日志

telnetnslookuppingftp分别用来测试啥

delphi多线程参数传递问题

连接两个范围函数结果