質問: gethostbyname(gethostname()) socket.gaierror: [Errno 8] nodename nor servname provided, or not known ``` 実行環境は、Windows、Mac共にPython3.7とAnacondaを使用しています。 何が原因のエラーでしょうか? 英語版での類似質問(stackoverflow.com/q/39970606) には共有設定から「プリンタの共有」をONにするとエラーなく実行できたとあったため、試してみたのですが、うまく行きませんでした。 その後、「ファイルの共有」をONにするとエラーなく動作したのですが、PCごとにどの共有ボタンにチェックを入れたら良いかが異なるのでしょうか?
回答: 「自分の IP アドレス」を知りたいようですが、そもそも論として - 1つの LAN ポートには複数の IP アドレスを振ることができる - 1つの PC には複数の LAN ポートを設置できる - loopback アドレスも自分の IP アドレスである あたりから `gethostbyname(gethostname())` の結果をもって自分の IP アドレスと呼ぶのは考慮が足らなさ過ぎて役に立たない可能性が高いです。誰かがオイラにこのような仕様を出してきたら、要求分析からやり直しと突っ返します。 XY 問題に陥っていませんか? `gethostbyname()` はホスト名から IP アドレスに変換する機能ですが、原則 **ほかのマシンの** ホスト名を与えて IP アドレスを得るのに使います。 `mailx.example.com` → `xxx.yyy.zzz.www` のように。その際に `DNS` `NIS(yp)` `ActiveDirectory` `NETBIOS(nmbd)` `/etc/hosts` など複数の手段を講じます。なので * ネットワーク上に名前解決できる何かが居て (DNS 代理サーバとか ActiveDirectory サーバとか) それがあなたのマシン名を知っている * あなたのマシンがその何かに接続できる なら `gethostbyname(あなたのマシン名)` が成功します。 小さな LAN で、名前解決が家庭用ルータの DNS 代理サーバのみ、という場合は TheInternet 上の FQDN は解決できても LAN 内のマシン名は解決できないかもしれません(最初の状況) ネットワーク共有を有効にすると、共有先サーバの `nmbd` があなたのマシンを知ることができ、あなたのマシンも `nmbd` に接続できるようになって、なので名前解決ができるようになるでしょう(2番目の状況) あるいは `/etc/hosts` というファイルに「ホスト名 vs IP アドレス」の対応表を書くことで IP アドレス固定な LAN 内部では名前解決ができるようになります(あなたが読んだネットの解説だが、今どきの家庭内 LAN では DHCP 動的アドレスを使うので適用不能) Windows で ActiveDirectory に参加しているマシンは AD サーバが名前解決してくれます (Windows でできて Mac でできない場合はたいていこれ) というわけで質問の答えとするなら、名前解決できる何か (サーバの `daemon` ) がいなかったから、となるでしょうか。 ちなみに `gethostbyname('localhost')` で `127.0.0.1` が得られると思いますが、これも立派な「自分の IP アドレス」です。あなたの目的に役立つかどうかは要求分析次第。