60872


Windows10では動いていたPythonのコードを、MacOS Mojaveに持っていくと動きませんでした。  
以下のようなコードをMacで実行しました。

**test.py**

[code]

    # -*- coding: utf-8 -*-
    from socket import socket, gethostbyname, gethostname, AF_INET, SOCK_DGRAM,SOL_SOCKET,SO_BROADCAST,SOCK_STREAM
    
    IP = gethostbyname(gethostname())
    print(IP)
    
[/code]

すると、以下のようなエラーが出て実行できませんでした

[code]

      File "/Volumes/ESD-USB/test.py", line 4, in <module>
        IP = gethostbyname(gethostname())
    socket.gaierror: [Errno 8] nodename nor servname provided, or not known
    
[/code]

実行環境は、Windows、Mac共にPython3.7とAnacondaを使用しています。  
何が原因のエラーでしょうか？

英語版での類似質問(stackoverflow.com/q/39970606)
には共有設定から「プリンタの共有」をONにするとエラーなく実行できたとあったため、試してみたのですが、うまく行きませんでした。  
その後、「ファイルの共有」をONにするとエラーなく動作したのですが、PCごとにどの共有ボタンにチェックを入れたら良いかが異なるのでしょうか？


CC BY-SA 4.0
2019-11-25T15:09:57.357
60835
2019-11-27T01:22:04.893
2019-11-26T04:02:39.670
22541
22541
question
python macos socket
Mac上でのIPアドレスの取得方法について


「自分の IP アドレス」を知りたいようですが、そもそも論として  
\- １つの LAN ポートには複数の IP アドレスを振ることができる  
\- １つの 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`
に接続できるようになって、なので名前解決ができるようになるでしょう（２番目の状況）

あるいは `/etc/hosts` というファイルに「ホスト名 vs IP アドレス」の対応表を書くことで IP アドレス固定な LAN
内部では名前解決ができるようになります（あなたが読んだネットの解説だが、今どきの家庭内 LAN では DHCP 動的アドレスを使うので適用不能）

Windows で ActiveDirectory に参加しているマシンは AD サーバが名前解決してくれます (Windows でできて Mac
でできない場合はたいていこれ)

というわけで質問の答えとするなら、名前解決できる何か (サーバの `daemon` ) がいなかったから、となるでしょうか。

* * *

ちなみに `gethostbyname('localhost')` で `127.0.0.1` が得られると思いますが、これも立派な「自分の IP
アドレス」です。あなたの目的に役立つかどうかは要求分析次第。


CC BY-SA 4.0
2019-11-27T01:22:04.893
60872
2019-11-27T01:22:04.893
8589
60835
answer