Sorry, I can't reproduce that behavior with my macOS 10.12, 10.11, or 10.10 systems if the hostname is a valid string including "localhost". If the string is empty or hostname is None, then I see Errno 8.
$ /usr/local/bin/python3.6
Python 3.6.0 (v3.6.0:41df79263a11, Dec 22 2016, 17:23:13)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import socket
>>> hostname = 'python.org'
>>> socket.getaddrinfo(hostname, None)
[(<AddressFamily.AF_INET: 2>, <SocketKind.SOCK_DGRAM: 2>, 17, '', ('23.253.135.79', 0)), (<AddressFamily.AF_INET: 2>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('23.253.135.79', 0)), (<AddressFamily.AF_INET6: 30>, <SocketKind.SOCK_DGRAM: 2>, 17, '', ('2001:4802:7901::e60a:1375:0:6', 0, 0, 0)), (<AddressFamily.AF_INET6: 30>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('2001:4802:7901::e60a:1375:0:6', 0, 0, 0))]
>>> hostname = "localhost"
>>> socket.getaddrinfo(hostname, None)
[(<AddressFamily.AF_INET6: 30>, <SocketKind.SOCK_DGRAM: 2>, 17, '', ('::1', 0, 0, 0)), (<AddressFamily.AF_INET6: 30>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('::1', 0, 0, 0)), (<AddressFamily.AF_INET: 2>, <SocketKind.SOCK_DGRAM: 2>, 17, '', ('127.0.0.1', 0)), (<AddressFamily.AF_INET: 2>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('127.0.0.1', 0))]
>>> hostname = ""
>>> socket.getaddrinfo(hostname, None)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/socket.py", line 743, in getaddrinfo
for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno 8] nodename nor servname provided, or not known
Perhaps there is something different about your hostname configuration on your Mac? macOS has some unusual ways of configuring the hostname resolutions. I don't have time at the moment to investigate further. But Python's socket module interfaces tend to be very thin wrappers around the underlying OS provided APIs. Perhaps you could test with a small C program that does the equivalent. |