如何使用Python获取本地主机的设备名称?
Python 获取设备名称替代IP的实现方法
完全可以用Python实现这个需求,以下是几种常见场景的解决方案:
1. 获取本地设备名称
直接用socket模块的gethostname()方法就能拿到当前设备的主机名:
import socket local_hostname = socket.gethostname() print(f"本地设备名称: {local_hostname}")
2. 通过IP地址反向解析设备名称
如果已知目标设备的IP,用socket.gethostbyaddr()可以反向查询对应的主机名:
import socket target_ip = "192.168.1.10" # 替换为目标IP try: hostname, _, _ = socket.gethostbyaddr(target_ip) print(f"{target_ip} 对应的设备名称: {hostname}") except socket.herror: print("无法解析该IP的设备名称,可能目标未开启相关服务")
3. 局域网内主动发现设备名称
如果需要扫描局域网内所有设备并获取名称,分两种场景处理:
Windows环境(NetBIOS协议)
借助pywin32库调用系统API扫描:
import win32net def scan_lan_devices(base_ip="192.168.1."): devices = [] for i in range(1, 255): ip = base_ip + str(i) try: wksta_info = win32net.NetWkstaGetInfo(ip, 100) devices.append((ip, wksta_info['wki100_computername'])) except: continue return devices # 执行扫描并打印结果 for ip, name in scan_lan_devices(): print(f"IP: {ip} 设备名称: {name}")
注:需要先安装pywin32,执行pip install pywin32
跨平台方案(mDNS协议)
用zeroconf库基于mDNS发现局域网设备,支持Windows、Linux、macOS:
import socket from zeroconf import Zeroconf, ServiceBrowser, ServiceListener class DeviceListener(ServiceListener): def add_service(self, zeroconf, service_type, name): service_info = zeroconf.get_service_info(service_type, name) if service_info: device_ip = socket.inet_ntoa(service_info.addresses[0]) device_name = service_info.server print(f"发现设备: {device_name} | IP: {device_ip}") # 初始化扫描 zeroconf_instance = Zeroconf() listener = DeviceListener() # 扫描HTTP服务设备,可根据需要修改服务类型 browser = ServiceBrowser(zeroconf_instance, "_http._tcp.local.", listener) # 保持运行,按回车停止 try: input("按回车键结束扫描...\n") finally: zeroconf_instance.close()
注:需要先安装zeroconf,执行pip install zeroconf
注意事项
- 设备名称解析依赖目标设备开启了DNS、NetBIOS或mDNS服务,否则无法获取名称
- 局域网扫描可能受防火墙、网络权限影响,部分设备会隐藏自身信息
- 第三方库安装需确保网络正常,执行对应
pip命令即可
内容的提问来源于stack exchange,提问作者wido
相关产品推荐
相关产品推荐

