153 votes

Comment puis-je voir s'il y a une connexion réseau disponible et active dans Python ?

Je veux voir si je peux accéder à une API en ligne, mais pour cela, je dois avoir un accès à Internet.

Comment puis-je voir si une connexion est disponible et active en utilisant Python ?

0 votes

Si vous êtes en python, il est presque certain qu'une exception sera levée en cas d'échec de connexion ou de dépassement de délai. Vous pouvez soit essayer de contourner ce problème, soit le laisser remonter à la surface.

1 votes

@Triptych : J'espère que c'était une blague, parce que ça ne marche pas.

2 votes

@inspecteurG4dget : easy_install system_of_tubes

143voto

unutbu Points 222216

Vous pourriez peut-être utiliser quelque chose comme ça :

import urllib2

def internet_on():
    try:
        urllib2.urlopen('http://216.58.192.142', timeout=1)
        return True
    except urllib2.URLError as err: 
        return False

Actuellement, 216.58.192.142 est l'une des adresses IP de google.com. Changement http://216.58.192.142 sur n'importe quel site où l'on peut s'attendre à une réponse rapide .

Cette IP fixe ne correspondra pas à google.com pour toujours. Ce code n'est donc pas pas robuste -- il faudra une maintenance constante pour qu'il continue à fonctionner.

La raison pour laquelle le code ci-dessus utilise une adresse IP fixe au lieu d'un nom de domaine pleinement qualifié (FQDN) est qu'un FQDN nécessiterait une consultation du DNS. Lorsque la machine ne dispose pas d'une connexion Internet opérationnelle, la recherche DNS elle-même peut bloquer l'appel à l'adresse IP. urllib_request.urlopen pendant plus d'une seconde. Merci à @rzetterberg de l'avoir signalé.


Si l'adresse IP fixe ci-dessus ne fonctionne pas, vous pouvez trouver une adresse IP courante pour google.com (sur unix) en exécutant

% dig google.com  +trace 
...
google.com.     300 IN  A   216.58.192.142

1 votes

Juste une note sur "l'appel à urlopen ne prendra pas beaucoup plus d'une seconde, même si l'internet n'est pas "allumé"". Ce n'est pas vrai si l'url fournie n'est pas valide, alors la recherche DNS sera bloquée. C'est seulement vrai pour la connexion réelle au serveur web. La façon la plus simple d'éviter ce blocage de la recherche DNS est d'utiliser l'adresse IP à la place, ce qui garantit que la recherche ne prendra qu'une seconde :)

8 votes

CELA NE FONCTIONNE PLUS. En date de septembre 2013, 74.125.113.99 s'arrête après un long moment, donc cette fonction retournera toujours False. Je suppose que Google a modifié la configuration de son réseau.

0 votes

@theamk : Merci de m'avoir prévenu. Je l'ai changé en 74.125.228.100 ce qui devrait fonctionner pour l'instant.

28voto

Def_Os Points 847

En guise d'alternative aux réponses de ubutnu/Kevin C, j'utilise la fonction requests paquet comme ça :

import requests

def connected_to_internet(url='http://www.google.com/', timeout=5):
    try:
        _ = requests.head(url, timeout=timeout)
        return True
    except requests.ConnectionError:
        print("No internet connection available.")
    return False

Bonus : cette fonction peut être étendue à une fonction de ping pour un site web.

def web_site_online(url='http://www.google.com/', timeout=5):
    try:
        req = requests.head(url, timeout=timeout)
        # HTTP errors are not raised by default, this statement does that
        req.raise_for_status()
        return True
    except requests.HTTPError as e:
        print("Checking internet connection failed, status code {0}.".format(
        e.response.status_code))
    except requests.ConnectionError:
        print("No internet connection available.")
    return False

2 votes

La demande est une grande bibliothèque. Cependant, contrairement à de nombreux exemples ici, j'utiliserais Exemple de l'IANA.com ou example.org comme un choix plus fiable à long terme, car il est entièrement contrôlé par l'administration de l'État. ICANN .

0 votes

Existe-t-il un autre moyen de vérifier l'état de fonctionnement d'Internet ? Parce que si vous vous languissez google.com encore une fois, alors ils bloqueront notre IP. Alors, y a-t-il un autre moyen ?

1 votes

Très bien. Je l'ai modifié en utilisant requests.head() pour obtenir uniquement une réponse HEAD.

17voto

Kevin C Points 151

Juste pour mettre à jour ce qu'a dit unutbu pour le nouveau code dans Python 3.2

def check_connectivity(reference):
    try:
        urllib.request.urlopen(reference, timeout=1)
        return True
    except urllib.request.URLError:
        return False

Et, juste pour noter, l'entrée ici (référence) est l'url que vous voulez vérifier : Je suggère de choisir quelque chose qui se connecte rapidement là où vous vivez -- par exemple, je vis en Corée du Sud, donc je mettrais probablement la référence à http://www.naver.com .

1 votes

Je vais attendre 30 secondes s'il n'y a pas de serveur DNS disponible.

10voto

Tomasz Wysocki Points 4392

Vous pouvez simplement essayer de télécharger des données, et si la connexion échoue, vous saurez que quelque chose ne va pas avec la connexion.

En fait, vous ne pouvez pas vérifier si l'ordinateur est connecté à Internet. Il peut y avoir de nombreuses raisons à cet échec, comme une mauvaise configuration DNS, des pare-feu, NAT. Ainsi, même si vous effectuez des tests, vous ne pouvez pas garantir que vous aurez une connexion avec votre API avant d'essayer.

2 votes

"Il est plus facile de demander le pardon que la permission".

0 votes

Ça n'a pas besoin d'être aussi bon. J'ai simplement besoin d'essayer de me connecter à un site ou d'envoyer un ping à quelque chose et si cela donne un timeout voilá. Comment puis-je faire cela ?

0 votes

Y a-t-il une raison pour laquelle vous ne pouvez pas simplement essayer de vous connecter à l'API ? Pourquoi devez-vous la vérifier avant de vous connecter réellement ?

5voto

mluebke Points 2588

Essayez l'opération que vous vouliez faire de toute façon. Si elle échoue, python devrait vous envoyer une exception pour vous le faire savoir.

Essayer d'abord une opération triviale pour détecter une connexion revient à introduire une condition de course. Que se passe-t-il si la connexion Internet est valide au moment du test mais qu'elle tombe en panne avant que vous n'ayez à effectuer votre travail ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X