测试ping的Python函数

37 投票
8 回答
198184 浏览
提问于 2025-04-28 14:00

我正在尝试创建一个函数,想要定时调用它来检查网络延迟(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。如果能得到一些帮助,我会非常感激。

暂无标签

8 个回答

3
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"))

当然可以!请把你想要翻译的内容发给我,我会帮你把它变得简单易懂。

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
14

在其他回答的基础上,你可以检查操作系统,然后决定是使用“-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)
21

这里有一个简化的函数,它返回一个布尔值,并且没有任何输出打印到标准输出。

import subprocess
import platform


def ping_ok(sHost) -> bool:
    try:
        subprocess.check_output(
            "ping -{} 1 {}".format("n" if platform.system().lower() == "windows" else "c", sHost), shell=True
        )
    except Exception:
        return False

    return True
49

看起来你想用到 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.comcodeacademy.com

编辑:这个问题现在有点老了,不过……如果你在使用 pingstatus 时遇到未定义或者返回值不对的问题,首先确保你的代码是正确的。然后试着在if语句块之前定义 pingstatus。这样可能会有帮助,但由此产生的问题就另当别论了。祝你好运。

撰写回答