如何在Python中获取Windows网络接口名称并修改IP地址
解决Windows下Python修改静态IP的问题
好问题!要实现这个需求,我们可以分两步走:先获取目标网络接口的名称,再执行IP修改操作。下面给你两种实用的方案:
一、获取网络接口名称的方法
不像socket.gethostname()那么直接,但有几种可靠的方式能拿到netsh识别的接口名称:
1. 解析netsh命令的输出
直接调用netsh interface show interface命令,然后从输出里提取接口名称。这种方法不需要额外安装库,纯Python就能实现:
import subprocess def get_active_interface_names(): # 执行netsh命令并获取输出 result = subprocess.check_output( ["netsh", "interface", "show", "interface"], encoding="gbk" # 根据系统编码调整,英文系统可换成utf-8 ) lines = result.splitlines() active_interfaces = [] # 跳过表头,遍历每一行提取启用的接口名称 for line in lines[3:]: parts = line.strip().split() if len(parts) >= 4 and parts[0] == "已启用": # 英文系统替换为"Enabled" # 接口名称可能包含空格,从第3个元素开始拼接 interface_name = " ".join(parts[3:]) active_interfaces.append(interface_name) return active_interfaces # 调用示例 print(get_active_interface_names())
2. 用WMI库查询(更优雅)
WMI是Windows的原生管理接口,能直接获取系统硬件和网络配置信息。先安装wmi库:pip install wmi,然后用下面的代码获取接口名称:
import wmi def get_interface_names(): c = wmi.WMI() interface_names = [] # 查询启用了IP功能的网络适配器 for adapter in c.Win32_NetworkAdapterConfiguration(IPEnabled=True): # NetConnectionID就是netsh里显示的接口名称 if adapter.NetConnectionID: interface_names.append(adapter.NetConnectionID) return interface_names # 调用示例 print(get_interface_names())
二、修改静态IP的两种方式
1. 结合subprocess调用netsh命令
拿到接口名称后,直接构造你需要的netsh命令执行即可,注意必须以管理员身份运行脚本:
import subprocess def set_static_ip(interface_name, ip, subnet_mask, gateway): try: # 设置IP和子网掩码 subprocess.run( ["netsh", "interface", "ip", "set", "address", f'"{interface_name}"', "static", ip, subnet_mask], check=True, shell=True ) # 设置网关 subprocess.run( ["netsh", "interface", "ip", "set", "address", f'"{interface_name}"', "static", ip, subnet_mask, gateway, "1"], check=True, shell=True ) print(f"静态IP设置成功!") except subprocess.CalledProcessError as e: print(f"设置失败:{e}") # 调用示例(替换成你的接口名称和IP参数) interface = "Wireless Network Connection" set_static_ip(interface, "192.168.1.3", "255.255.255.0", "192.168.1.1")
2. 用WMI直接修改(无需调用外部命令)
还是用WMI库,直接调用适配器的方法来修改IP,同样需要管理员权限:
import wmi def set_static_ip_wmi(ip, subnet_mask, gateway): c = wmi.WMI() for adapter in c.Win32_NetworkAdapterConfiguration(IPEnabled=True): # 设置静态IP ip_result = adapter.EnableStatic(IPAddress=[ip], SubnetMask=[subnet_mask]) # 设置网关 gateway_result = adapter.SetGateways(DefaultIPGateway=[gateway], GatewayCostMetric=[1]) if ip_result[0] == 0 and gateway_result[0] == 0: print(f"已为接口 {adapter.NetConnectionID} 设置静态IP") else: print(f"接口 {adapter.NetConnectionID} 设置失败") # 调用示例 set_static_ip_wmi("192.168.1.3", "255.255.255.0", "192.168.1.1")
注意事项
- 无论哪种方法,必须以管理员身份运行Python脚本,否则会因权限不足失败。
- 如果是英文系统,要把代码里的“已启用”改成“Enabled”,避免解析错误。
内容的提问来源于stack exchange,提问作者Hrvoje T
相关产品推荐
相关产品推荐

