为什么Python HTTPLib会报socket.gaierror: [Errno -2]?

12 投票
2 回答
38671 浏览
提问于 2025-04-18 07:10

我的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 个回答

0

在我的情况下,我更改了主机名。所以我发现 /etc/hosts 文件里还是旧的主机名。我只需要在 /etc/hosts 文件里把它更新为新的主机名,这样就解决了问题。

16

socket.gaierror这个错误是因为Python无法运行getaddrinfo()getnameinfo()这两个函数。在你的情况中,很可能是前者出问题了。这个函数的作用是接收一个主机名和一个端口,然后返回一个包含连接信息的列表。如果你给它一个主机名,它会尝试把这个主机名转换成一个IP地址。

所以,这个错误的原因可能是Python无法把你写的地址(yun.local)转换成一个有效的IP地址。我建议你去设备上的/etc/hosts文件里看看,这个地址是否在那儿被定义过。你也可以使用一些命令行工具,比如hosttelnet,来检查一下地址解析的情况:

例如:

[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

撰写回答