HOWTO · Python
Python Ping
Ce tutoriel montre comment effectuer un ping sur un serveur en Python
Sur cette page
Pour vérifier depuis Python si un hôte répond aux requêtes ICMP Echo, vous pouvez appeler la commande système ping avec subprocess.call() ou os.system(), ou utiliser la fonction ping3.ping(). Une réponse peut indiquer que l’hôte est joignable et fournir le temps aller-retour, mais elle ne prouve pas qu’une application ou un service donné est disponible. Les résultats dépendent également du système d’exploitation, des outils installés, des règles du pare-feu et de la politique réseau.
Envoyer un ping à un serveur en Python avec subprocess.call()
subprocess.call() exécute un programme et renvoie son code de sortie. En passant la commande sous forme de liste, vous évitez de construire une commande shell à partir du nom de l’hôte. L’option qui définit le nombre de paquets varie selon la plateforme : les implémentations courantes de ping utilisent -n sous Windows et -c sous Unix et ses dérivés.
import platform
import shutil
import subprocess
def ping_host(host):
ping = shutil.which("ping")
if ping is None:
return None # The ping program is not installed or on PATH.
count_option = "-n" if platform.system() == "Windows" else "-c"
try:
status = subprocess.call(
[ping, count_option, "1", host],
stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL,
timeout=5,
)
except (OSError, subprocess.TimeoutExpired):
return None
return status == 0
result = ping_host("example.com")
if result is None:
print("ping is unavailable")
else:
print("host responded" if result else "no successful response")
Sortie observée dans l’environnement d’exécution fourni. Le bloc de sortie est conservé à l’identique ; ses libellés restent en anglais.
ping is unavailable
Comme le montre la sortie, la commande ping n’était pas disponible dans l’environnement d’exécution fourni. Dans un environnement où elle est installée, cet exemple nécessite également un accès réseau. Il masque la sortie de la commande et renvoie True si le processus se termine avec le code zéro, False si le code est différent de zéro, ou None si le programme est introuvable ou si le délai d’attente expire. Un code différent de zéro ne permet pas de déterminer si la cause est une perte de paquets, un filtrage, une résolution de nom ou une autre condition propre au système. Adaptez l’hôte et l’option de nombre de paquets à votre environnement.
Envoyer un ping à un serveur en Python avec os.system()
os.system() exécute une chaîne de commande dans un shell et renvoie un code dont l’encodage dépend de la plateforme. Cette fonction est moins flexible que subprocess.call(), et concaténer à la commande un nom d’hôte non fiable peut permettre une injection shell. Pour les valeurs susceptibles de provenir d’utilisateurs, privilégiez une liste d’arguments avec subprocess.call(). Si vous utilisez os.system() avec un hôte fixe et fiable, choisissez l’option de nombre de paquets adaptée à la plateforme :
import os
import platform
import shutil
host = "example.com" # Keep this fixed or validate it before use.
ping = shutil.which("ping")
if ping is None:
print("ping is unavailable")
else:
count_option = "-n" if platform.system() == "Windows" else "-c"
status = os.system(f'"{ping}" {count_option} 1 {host} > "{os.devnull}" 2>&1')
print("host responded" if status == 0 else "no successful response")
Sortie observée dans l’environnement d’exécution fourni. Le bloc de sortie est conservé à l’identique ; ses libellés restent en anglais.
ping is unavailable
Comme le montre la sortie, la commande ping n’était pas disponible dans l’environnement d’exécution fourni. Lorsqu’elle est disponible, cet exemple dépend du shell local, de l’implémentation de ping et du réseau. Mettre le chemin de l’exécutable entre guillemets permet de gérer les espaces dans ce chemin, mais les chaînes de commande shell doivent toujours être manipulées avec précaution : ne remplacez pas host par une entrée utilisateur arbitraire. Le code de retour indique le résultat de la commande shell ; il ne dit pas si un service, tel qu’un serveur web, accepte les connexions.
Envoyer un ping à un serveur en Python avec ping3.ping()
La troisième option est la fonction ping3.ping(), qui envoie une requête ICMP Echo sans appeler la commande système ping. Installez le paquet ping3 dans l’environnement Python utilisé par votre script avec python -m pip install ping3. Selon le système d’exploitation et les privilèges disponibles, l’envoi de paquets ICMP peut nécessiter des autorisations supplémentaires.
try:
from ping3 import ping
except ImportError:
print("Install ping3 with: python -m pip install ping3")
else:
host = "example.com"
response = ping(host)
if response is None or response is False:
print("no response reported")
else:
print(f"round-trip time: {response} seconds")
Sortie observée dans l’environnement d’exécution fourni. Le bloc de sortie est conservé à l’identique ; ses libellés restent en anglais.
Install ping3 with: python -m pip install ping3
Comme le montre la sortie, le paquet ping3 n’était pas installé dans l’environnement d’exécution fourni. Après son installation, cet exemple nécessite également des autorisations ICMP appropriées et un accès réseau. Une réponse numérique représente le temps aller-retour en secondes. Interprétez l’absence de réponse en fonction du comportement de la bibliothèque installée et de l’environnement ; ne supposez pas qu’elle permet de distinguer un hôte injoignable de paquets filtrés ou perdus.
Choisissez subprocess.call() si vous souhaitez transmettre les arguments de manière sûre et utiliser l’utilitaire ping du système. os.system() offre une option plus courte, fondée sur un shell, pour une commande fixe et fiable. ping3.ping() permet d’effectuer l’appel depuis Python et peut renvoyer une durée, mais nécessite un paquet supplémentaire et peut soulever des questions d’autorisation. Dans les trois cas, le ping vérifie uniquement la joignabilité par ICMP ; pour savoir si un service précis fonctionne, effectuez un contrôle au niveau de l’application.