2014-05-21 12 views
6
codice

mio Python è molto semplice, fare una richiesta GET su una pagina web creata su un Arduino Yun.Perché ricevo socket.gaierror: [Errno -2] da Python httplib

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

Quando eseguo questo sul lato Linux del Arduino Yun, il seguente errore si presenta socket.gaierror: [Errno -2] Nome o servizio non conosciuti. Tuttavia, quando eseguo lo stesso script sul mio Mac, funziona perfettamente.

ho superare questo problema modificando l'argomento HTTPConnection a httplib.HTTPConnection ("192.168.240.1"), che è l'IP dal Arduino Yun.

Quindi, perché è questo errore mostrando sul lato Linux di Arduino e non nel mio Mac?

Grazie.

+0

Il 'yun.local' è configurato in'/etc/hosts' su Arduino? ... –

+0

L'unica cosa all'interno di quel file è "127.0.0.1 localhost" –

+0

Quindi 'yun.local' non esiste sulla tua distribuzione Linux. Quindi l'errore. Prova a 'ping yun.local' via SSH, vedrai lo stesso problema. Aggiungi '192.168.240.1 yun.local' e dovrebbe andare bene. –

risposta

8

Il socket.gaierror deriva da Python che non è in grado di eseguire getaddrinfo() o getnameinfo(). Nel tuo caso è probabile il primo. Questa funzione accetta un host e una porta e restituisce un elenco di tuple con informazioni su come connettersi a un host. Se si assegna un nome host a tale funzione, si tenterà di risolvere l'indirizzo IP più in profondità.

Quindi, l'errore dovrebbe provenire dal fatto che Python non è in grado di risolvere l'indirizzo che hai scritto (yun.local) in un indirizzo IP valido. Ti suggerisco di guardare in /etc/hosts sul dispositivo per vedere se è stato definito lì. Si può anche provare con gli strumenti di riga di comando come host o telnet, solo per controllare la risoluzione di:

Ad esempio:

[[email protected] ~]$ telnet localhost 80 
Trying ::1... 
Trying 127.0.0.1... 
telnet: Unable to connect to remote host: Connection refused 

C'è riuscita a risolvere il mio localhost a ::1 (IPv6) e 127.0.0.1 (IPv4), perché esiste in /etc/resolv.conf. Se io invece provo con il tuo host:

[[email protected] ~]$ telnet yun.local 80 
telnet: could not resolve yun.local/80: Name or service not known 
+1

Posso capire meglio come si presenta l'errore. Ho controllato sia "/etc/resolv.conf" che "/ etc/hosts" sul mio Mac e sul mio Linux e il contenuto in entrambi è lo stesso. Quindi ancora non capisco perché l'errore si presenta su Linux e non sul Mac. –

+0

Dicendo che l'errore non viene visualizzato, intendi che il codice Python funziona se lo esegui sul tuo Mac? Quello che sto cercando è se è solo una differenza nella segnalazione degli errori o se riesce davvero a trovare l'indirizzo IP per il 'yun.local' lì in qualche modo magico. La maggior parte delle funzionalità di rete in Python esegue il mapping delle funzioni di sistema. Le differenze di sistema possono causare comportamenti diversi in condizioni di errore. –

+0

Sì, l'interprete Python in mio Mac trova l'indirizzo IP per 'yun.local' ma l'interprete Python in Linux non trova l'indirizzo IP per' yun.local'.Quindi probabilmente hai ragione, ci devono essere alcune differenze di sistema che potrebbero causare un comportamento diverso. –

0

Nel mio caso, ho cambiato il nome host. Così ho realizzato che/etc/hosts è rimasto il vecchio hostname, ho appena aggiornato il nuovo hostname nel file/etc/hosts e questo ha funzionato per me.

Problemi correlati