Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么要从Python HTTPLib获取socket.gaierror:[Errno-2]_Python_Linux_Sockets - Fatal编程技术网

为什么要从Python HTTPLib获取socket.gaierror:[Errno-2]

为什么要从Python HTTPLib获取socket.gaierror:[Errno-2],python,linux,sockets,Python,Linux,Sockets,我的Python代码非常简单,在Arduino Youú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 Youún的Linux端运行此程序时,会出现以下错误:soc

我的Python代码非常简单,在Arduino Youú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 Youún的Linux端运行此程序时,会出现以下错误:socket.gaierro:[Errno-2]名称或服务未知。然而,当我在Mac上运行相同的脚本时,它就可以正常工作了

我通过将HTTPConnection参数更改为httplib.HTTPConnection(“192.168.240.1”),这是来自Arduino的IP,从而克服了这个问题

那么,为什么这个错误出现在Arduino的Linux端而不是我的Mac中


谢谢。

socket.gairror源于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

在我的例子中,我更改了主机名。因此我意识到/etc/hosts仍然是旧的主机名,我只是在/etc/hosts文件中更新了新的主机名,这对我来说很有效。

是否在Arduino上的
/etc/hosts
中配置了
/local
…该文件中唯一的内容是“127.0.0.1 localhost”因此,您的Linux发行版上不存在
yun.local
。因此出现了错误。通过SSH尝试
ping yun.local
,您将看到相同的问题。添加
192.168.240.1 yun.local
就可以了。谢谢@MaximeLorant的帮助。另外,我在我的Mac上检查了相同的文件,并且内容是相同的。为什么在我的Mac上运行脚本时,这个错误不会出现?我可以更好地理解错误是如何产生的。我已经在Mac和Linux上检查了“/etc/resolv.conf”和“/etc/hosts”,两者的内容都是相同的。所以我还是不明白为什么这个错误会出现在Linux上而不是Mac上。说这个错误没有出现,你的意思是说如果你在Mac上运行Python代码,它会工作吗?我想问的是,这是否只是错误报告中的一个差异,还是它真的以某种神奇的方式成功地找到了
yun.local
的IP地址。Python中的大多数网络功能都映射到系统功能。系统差异可能会导致错误情况下的不同行为。是的,我的Mac中的Python解释器会找到
yun.local
的IP地址,但Linux中的Python解释器不会找到
yun.local
的IP地址。所以你可能是对的,一定有一些系统差异可能导致不同的行为。这个想法是通过使用
yun.local
我不必关心IP地址。否则,我需要为设备设置一个静态IP地址。不幸的是,我不是一个Mac用户,不知道为什么你的Mac可以找到该主机的IP。现在我只是在猜测:你有没有在你的Mac电脑上运行任何可以改变系统功能的设备开发工具,以便系统知道主机和IP?