web-dev-qa-db-fra.com

Pourquoi est-ce que je reçois socket.gaierror: [Errno -2] de Python HTTPLib

Mon code Python est très simple, faites une requête GET sur une page Web créée sur un Arduino Yún.

import httplib
conn = httplib.HTTPConnection("yun.local")
conn.request("GET", "/arduino/read/temp/0")
r1 = conn.getresponse()
print r1.status, r1.reason, r1.read()

Lorsque j'exécute ceci du côté Linux de l'Arduino Yún, l'erreur suivante s'affiche socket.gaierror: [Errno -2] Nom ou service inconnu . Cependant, lorsque je lance le même script sur mon Mac, cela fonctionne parfaitement.

J'ai surmonté ce problème en modifiant l'argument HTTPConnection en httplib.HTTPConnection ("192.168.240.1") , qui correspond à l'adresse IP de l'Arduino Yun.

Alors, pourquoi cette erreur apparaît-elle du côté Linux d’Arduino et non de mon Mac? 

Merci.

8
Ricardo Garzo

Le socket.gaierror provient de Python ne pouvant pas exécuter getaddrinfo() ou getnameinfo(). Dans votre cas, c'est probablement le premier. Cette fonction prend un hôte et un port et renvoie une liste de nuplets contenant des informations sur la connexion à un hôte. Si vous attribuez un nom d'hôte à cette fonction, nous tenterons de résoudre l'adresse IP plus en profondeur ci-dessous.

Ainsi, l’erreur devrait provenir du fait que Python n’a pas pu résoudre l’adresse que vous avez écrite (yun.local) en une adresse IP valide. Je vous suggère de regarder dans /etc/hosts sur le périphérique pour voir s'il est défini ici. Vous pouvez également essayer avec des outils en ligne de commande tels que Host ou telnet, juste pour vérifier la résolution:

Par exemple: 

[pugo@q-bert ~]$ telnet localhost 80
Trying ::1...
Trying 127.0.0.1...
telnet: Unable to connect to remote Host: Connection refused

Là, il a réussi à résoudre ma localhost en ::1 (IPv6) et 127.0.0.1 (IPv4), car elle existe dans /etc/resolv.conf. Si j'essaie plutôt avec votre hôte:

[pugo@q-bert ~]$ telnet yun.local 80
telnet: could not resolve yun.local/80: Name or service not known
11
Anders Piniesjö

Dans mon cas, j'ai changé le nom d'hôte. J'ai donc réalisé que/etc/hosts restait l'ancien nom d'hôte. Je viens de mettre à jour le nouveau nom d'hôte dans le fichier/etc/hosts et cela a fonctionné pour moi.

0
Ricardo De Leon