How to Ping from Python

Here’s a quick tip on how to Ping from Python!

Today, I had a need to do a quick ping test from a Python script. It took me a bit of searching to figure out how to do it properly. Most of the examples I saw in the wild ended up displaying results to the screen (or stdout), which is not at all what I was looking for.

Here is what I ended up with:

#!/usr/bin/python -tt
import platform
import subprocess
import sys  # This import is only needed to get command line arguments.

def ping_test(host, ping_count=1):
  # Some systems use different parameters for ping count
  # Linux and MacOS use -n, Windows uses -c
  # Adjust this as necessary for other systems
  count_param = '-n' if platform.system().lower() == 'windows' else '-c'
  # subprocess.Popen takes a list of parameters, starting with the command to run
  command = ['ping', count_param, str(ping_count), host]
  # When calling subprocess.Popen, we are redirecting stdout and stderr to PIPE
  # This will cause the proces to return a tuple of (stdout, stderr) when communicate
  #   is called
  # We do this even if we don't want or need the results, so it doesn't display to
  #   screen while executing
  process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  result = process.communicate()
  # Use the Popen variable (i.e. process) to get the return code.  The output from the
  #   command is held in result, as described above.
  # In this example, we are only looking at stdout.  We could also get stderr as result[1]
  #   if that were interesting to us.
  return (process.returncode, result[0])

# This function is just to get command line arguments, and demonstrate how to call
#   The ping_test function.
def main():
  args = sys.argv[1:]
  if len(args) < 1:
  	print 'Usage: %s host-or-ip [count]' % sys.argv[0]
  return_code, result = ping_test(*args[:2])
  print 'Ping Successful' if return_code == 0 else 'Ping Failure'
  print result

# Standard boilerplate to call the main() function.
if __name__ == '__main__':

Leave a Reply

Your email address will not be published. Required fields are marked *