web-dev-qa-db-ja.com

なぜsocket.gaierrorが表示されるのですか:Python HTTPLibから[Errno -2]

私のPythonコードは非常に単純です。ArduinoYúnで作成されたWebページで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()

これをArduinoYúnのLinux側で実行すると、次のエラーが表示されますsocket.gaierror:[Errno -2]名前またはサービスが不明。ただし、Macで同じスクリプトを実行すると、正常に機能します。

この問題を解決するには、HTTPConnection引数をhttplib.HTTPConnection( "192.168.240.1")に変更します。これは、Arduino YunからのIPです。

では、なぜこのエラーが私のMacではなく、ArduinoのLinux側に表示されるのですか?

ありがとう。

11
Ricardo Garzo

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

そこで、::1に存在するため、localhost127.0.0.1(IPv6)および/etc/resolv.conf(IPv4)に解決できました。私が代わりにあなたのホストで試す場合:

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

私の場合、ホスト名を変更しました。そのため、/ etc/hostsが古いホスト名のままであることに気付き、/ etc/hostsファイルで新しいホスト名に更新しただけでうまくいきました。

0
Ricardo De Leon