macOS Big Sur下Python获取IP报socket.gaierror [Errno 8]问题
故障原因
macOS Big Sur 对本地主机名的解析规则做了调整:socket.gethostname() 返回的本地主机名默认不会被写入本地 hosts 解析记录,直接调用 socket.gethostbyname() 做解析时就会触发 nodename nor servname provided, or not known 报错,该问题和 Python 版本无关,升级 Python 版本无法解决。
解决方案
按易用性和稳定性排序,可任选以下一种方案修复:
方案1:补全本地hosts映射(适合不想修改原有代码的场景)
- 打开终端执行
hostname命令,拿到当前设备的主机名,格式一般类似xxx-MacBook-Pro.local - 编辑
/etc/hosts文件,新增一行解析记录:127.0.0.1 你刚才拿到的完整主机名 - 保存配置后重新运行原有代码即可正常返回IP。注意如果后续修改了设备主机名,需要同步更新hosts里的对应条目。
- 打开终端执行
方案2:通过UDP路由获取活动出口IP(优先推荐,无需修改系统配置)
该方案不依赖本地主机名解析,逻辑是创建UDP套接字连接公共地址(UDP是无连接协议,不会真的向外发起请求),直接从套接字信息中读取当前网卡的出口IP,跨系统版本兼容性最好,替换原有代码即可:import socket def get_local_ip(): with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s: # 地址可替换为任意公网可达的IP,仅用于触发路由选择 s.connect(("8.8.8.8", 80)) return s.getsockname()[0] ip_address = get_local_ip() print(ip_address)方案3:遍历网卡枚举所有IP(适合需要获取多网卡IP的场景)
如果需要拿到设备上所有网卡绑定的IP(包括虚拟网卡、有线/无线网卡),可以安装第三方包netifaces遍历所有网卡地址,过滤掉回环地址127.0.0.1即可,该方法同样不依赖主机名解析。
注意:重装Python、给解释器开root权限这类操作对解决该问题无效,不需要尝试。
内容的提问来源于stack exchange,提问作者Authorized
相关产品推荐
相关产品推荐

