为什么Python HTTPLib会报socket.gaierror: [Errno -2]?
我的Python代码很简单,就是在一个用Arduino Yún创建的网页上发起一个GET请求。
import httplib
conn = httplib.HTTPConnection("yun.local")
conn.request("GET", "/arduino/read/temp/0")
r1 = conn.getresponse()
print r1.status, r1.reason, r1.read()
当我在Arduino Yún的Linux系统上运行这个代码时,出现了一个错误,提示是socket.gaierror: [Errno -2] Name or service not known。但是,当我在我的Mac上运行同样的脚本时,它就能正常工作。
我通过把HTTPConnection的参数改成httplib.HTTPConnection("192.168.240.1")来解决了这个问题,这个IP地址就是Arduino Yún的地址。
那么,为什么这个错误在Arduino的Linux系统上出现,而在我的Mac上却没有呢?
谢谢。
2 个回答
在我的情况下,我更改了主机名。所以我发现 /etc/hosts 文件里还是旧的主机名。我只需要在 /etc/hosts 文件里把它更新为新的主机名,这样就解决了问题。
socket.gaierror
这个错误是因为Python无法运行getaddrinfo()
或getnameinfo()
这两个函数。在你的情况中,很可能是前者出问题了。这个函数的作用是接收一个主机名和一个端口,然后返回一个包含连接信息的列表。如果你给它一个主机名,它会尝试把这个主机名转换成一个IP地址。
所以,这个错误的原因可能是Python无法把你写的地址(yun.local
)转换成一个有效的IP地址。我建议你去设备上的/etc/hosts
文件里看看,这个地址是否在那儿被定义过。你也可以使用一些命令行工具,比如host
或telnet
,来检查一下地址解析的情况:
例如:
[pugo@q-bert ~]$ telnet localhost 80
Trying ::1...
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused
在这里,它成功地把我的localhost
解析成了::1
(IPv6)和127.0.0.1
(IPv4),因为这个信息在/etc/resolv.conf
文件中存在。如果我尝试用你的主机名:
[pugo@q-bert ~]$ telnet yun.local 80
telnet: could not resolve yun.local/80: Name or service not known