使用 Python 检测可用的网络适配器

I.K*_*.K. 1 python networking psutil

我想检测连接到 DHCP 并从中获取 IP 的可用网络接口。我正在使用以下脚本来生成可用适配器的列表。

import psutil
addrs = psutil.net_if_addrs()
all_network_interfaces = addrs.keys()
available_networks = []
for value in all_network_interfaces:
    if addrs[value][1][1].startswith("169.254"):
        continue
    else:
        available_networks.append(value)
print(available_networks)
Run Code Online (Sandbox Code Playgroud)

以 169.254 开头的适配器是使用自动专用 IP 寻址 (APIPA) 的适配器,因此我想将它们过滤掉。当我使用以太网电缆连接时,此脚本会显示相关适配器,如果我在以太网仍然连接的情况下也通过 WiFi 连接,则会将 WiFi 添加到列表中。然而,在断开与 WiFi 的连接后,WiFi 适配器仍然保留该 IP,并且仍然存在于列表中。我认为这是我的适配器卡的问题(可能是功能问题)。绕过此问题并仅获取具有 DHCP 连接的适配器的最佳方法是什么?

Rom*_*est 5

仅psutil.net_if_stats()启动并运行网络接口:

import psutil

addresses = psutil.net_if_addrs()
stats = psutil.net_if_stats()

available_networks = []
for intface, addr_list in addresses.items():
    if any(getattr(addr, 'address').startswith("169.254") for addr in addr_list):
        continue
    elif intface in stats and getattr(stats[intface], "isup"):
        available_networks.append(intface)

print(available_networks)
Run Code Online (Sandbox Code Playgroud)

示例输出:

['lo0', 'en0', 'en1', 'en2', 'en3', 'bridge0', 'utun0']
Run Code Online (Sandbox Code Playgroud)