macOS系统调用socket.gethostbyname(socket.gethostname())报错如何解决
macOS下socket.gethostbyname调用报错的解决方案
报错原因
该报错的核心是macOS系统默认没有将本机主机名映射到/etc/hosts文件的本地回环地址中,而Windows系统默认完成了该映射,因此同一段代码在Windows可以正常运行,在macOS会触发nodename nor servname provided错误。
解决方案
方案1:修改系统hosts配置(永久修复原代码运行问题)
- 第一步:打开终端执行命令
hostname,复制输出的当前主机名 - 第二步:执行命令
sudo vim /etc/hosts,输入开机密码后打开hosts配置文件 - 第三步:分别在127.0.0.1和::1的配置行末尾追加刚才复制的主机名,修改后示例如下:
127.0.0.1 localhost your-host-name ::1 localhost your-host-name
- 第四步:保存退出配置文件后,执行
dscacheutil -flushcache刷新系统DNS缓存即可,原代码可正常运行
方案2:使用兼容性更好的IP获取代码(无需修改系统配置)
如果不想修改系统配置,可以替换原有写法,使用更稳定的跨平台IP获取逻辑,该逻辑在macOS、Windows、Linux下均能正常返回当前激活网卡的IPv4地址,不受VPN、多网卡场景影响:
import socket def get_local_ip(): test_conn = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) try: # 无需实际建立连接,仅用于获取当前网卡的对外IP test_conn.connect(("114.114.114.114", 80)) local_ip = test_conn.getsockname()[0] except Exception: local_ip = "127.0.0.1" finally: test_conn.close() return local_ip
内容的提问来源于stack exchange,提问作者Naeem Khoshnevis
相关产品推荐
相关产品推荐

