Pinging servers in Python

icmp, ping, python, python-3.x

Solution

This function works in any OS (Unix, Linux, macOS, and Windows) Python 2 and Python 3

EDITS: By @radato `os.system` was replaced by `subprocess.call`. This avoids shell injection vulnerability in cases where your hostname string might not be validated.

import platform    # For getting the operating system name
import subprocess  # For executing a shell command

def ping(host):
    """
    Returns True if host (str) responds to a ping request.
    Remember that a host may not respond to a ping (ICMP) request even if the host name is valid.
    """

    # 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, '1', host]

    return subprocess.call(command) == 0

Note that, according to @ikrase on Windows this function will still return `True` if you get a `Destination Host Unreachable` error.

Explanation

The command is `ping` in both Windows and Unix-like systems. The option `-n` (Windows) or `-c` (Unix) controls the number of packets which in this example was set to 1.

`platform.system()` returns the platform name. Ex. `'Darwin'` on macOS. `subprocess.call()` performs a system call. Ex. `subprocess.call(['ls','-l'])`.

Problem

In Python, is there a way to ping a server through ICMP and return TRUE if the server responds, or FALSE if there is no response?

Original source

Related problems