You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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映射(适合不想修改原有代码的场景)

    1. 打开终端执行 hostname 命令,拿到当前设备的主机名,格式一般类似 xxx-MacBook-Pro.local
    2. 编辑 /etc/hosts 文件,新增一行解析记录:127.0.0.1 你刚才拿到的完整主机名
    3. 保存配置后重新运行原有代码即可正常返回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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 20:51:31