I'm trying to create a function that I can call on a timed basis to check for good ping and return the result so I can update the on-screen display. I am new to python so I don't fully understand how to return a value or set a variable in a function.

Here is my code that works:

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

Here is my attempt at creating a function:

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" 

And here is how I display pingstatus:

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

So what I am looking for is how to return pingstatus from the function. Any help would be greatly appreciated.

3

7 Answers

It looks like you want the return keyword

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 

You need to capture/'receive' the return value of the function(pingstatus) in a variable with something like:

pingstatus = check_ping() 

NOTE: ping -c is for Linux, for Windows use ping -n

Some info on python functions:

It's probably worth going through a good introductory tutorial to Python, which will cover all the fundamentals. I recommend investigating Udacity.com and codeacademy.com

EDIT: This is an old question now, but.. for people who have issues with pingstatus not being defined, or returning an unexpected value, first make triple sure your code is right. Then try defining pingstatus before the if block. This may help, but issues arising from this change are for a different question. All the best.

9

Here is a simplified function that returns a boolean and has no output pushed to stdout:

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 

Adding on to the other answers, you can check the OS and decide whether to use "-c" or "-n":

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

This will work on Windows, OS X, and Linux

You can also use sys:

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

Try this

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

This function will test ping for given number of retry attempts and will return True if reachable else 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))) 

Output :

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 

Note : Change xx.xx.xx.xx with your IP

This is my version of check ping function. May be if well be usefull for someone:

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" 
1

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy