Python獲取本機所有網(wǎng)卡IP/MAC地址的三種方法
本文詳解 3 種 Python 實現(xiàn)方案,支持
Windows/Linux/MacOS
跨平臺,完美適配多網(wǎng)卡場景,可直接獲取所有網(wǎng)絡(luò)適配器的 IP 地址、MAC 地址、網(wǎng)卡名稱、子網(wǎng)掩碼等信息,代碼開箱即用!
一、應(yīng)用場景
在網(wǎng)絡(luò)編程、運維自動化、設(shè)備授權(quán)等場景中,經(jīng)常需要獲取本機網(wǎng)卡信息,常見需求包括:
- 多網(wǎng)卡服務(wù)器自動識別可用 IP
- 設(shè)備綁定(基于 MAC + IP 校驗授權(quán))
- 本地網(wǎng)絡(luò)調(diào)試、自動化腳本開發(fā)
- 設(shè)備信息采集與上報系統(tǒng)
二、核心方案對比(先選對再用)
| 實現(xiàn)方案 | 依賴庫 | 多網(wǎng)卡支持 | 信息完整性(IP+MAC + 網(wǎng)卡名) | 跨平臺 | 推薦度 |
|---|---|---|---|---|---|
| 標準庫(socket+uuid) | 無(內(nèi)置) | 一般 | 僅 IP + 默認 MAC,無網(wǎng)卡名 | ? | ?? |
| netifaces 第三方庫 | 需安裝 | 完美 | 完整(IP+MAC + 網(wǎng)卡名 + 子網(wǎng)掩碼) | ? | ????? |
| 系統(tǒng)命令調(diào)用(ipconfig/ifconfig) | 無 | 較好 | IP+MAC,需解析輸出 | ? | ??? |
結(jié)論:優(yōu)先使用
netifaces
庫,兼顧穩(wěn)定性、完整性和易用性;無第三方庫依賴場景用系統(tǒng)命令調(diào)用。
三、方案 1:標準庫實現(xiàn)(無依賴,快速獲取)
無需安裝任何第三方包,基于 Python 內(nèi)置 socket(獲取 IP)和 uuid(獲取 MAC)實現(xiàn),適合簡單場景。
完整代碼
import socket
import uuid
def get_default_host_ip():
"""獲取本機默認上網(wǎng) IP(優(yōu)先返回外網(wǎng)可達 IP)"""
try:
# 連接公共 DNS(8.8.8.8 為 Google DNS),無需實際通信,僅用于獲取本地網(wǎng)卡 IP
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("8.8.8.8", 80))
ip = s.getsockname()[0] # 獲取連接對應(yīng)的本地 IP
except Exception as e:
ip = "127.0.0.1" # 異常時返回本地回環(huán)地址
finally:
s.close()
return ip
def get_default_mac_address():
"""獲取本機默認網(wǎng)卡 MAC 地址"""
# uuid.getnode() 返回 48 位整數(shù)形式的 MAC 地址
mac_int = uuid.getnode()
mac_hex = hex(mac_int)[2:] # 轉(zhuǎn)換為十六進制(去掉 0x 前綴)
# 格式化為 xx:xx:xx:xx:xx:xx
return ":".join([mac_hex[i:i+2] for i in range(0, 12, 2)])
def get_all_ipv4_addresses():
"""獲取所有網(wǎng)卡的 IPv4 地址(過濾回環(huán)地址)"""
hostname = socket.gethostname()
# gethostbyname_ex 返回 (主機名, 別名列表, IP 列表)
ip_list = socket.gethostbyname_ex(hostname)[2]
# 過濾 127.0.0.1 等回環(huán)地址
return [ip for ip in ip_list if not ip.startswith("127.")]
if __name__ == '__main__':
print("=== 本機網(wǎng)絡(luò)信息(標準庫方案)===")
print(f"默認上網(wǎng) IP:{get_default_host_ip()}")
print(f"默認 MAC 地址:{get_default_mac_address()}")
print(f"所有網(wǎng)卡 IPv4:{get_all_ipv4_addresses()}")
運行效果
=== 本機網(wǎng)絡(luò)信息(標準庫方案)=== 默認上網(wǎng) IP:192.168.1.105 默認 MAC 地址:a1:b2:c3:d4:e5:f6 所有網(wǎng)卡 IPv4:['192.168.1.105', '192.168.3.26']
優(yōu)缺點
- ? 優(yōu)點:零依賴、代碼簡潔、快速上手
- ? 缺點:無法對應(yīng) “網(wǎng)卡名 - IP-MAC” 三者關(guān)系,多網(wǎng)卡場景信息不完整
四、方案 2:netifaces 庫(推薦,多網(wǎng)卡完美支持)
netifaces 是專門用于獲取網(wǎng)絡(luò)接口信息的第三方庫,跨平臺兼容,能精準獲取每個網(wǎng)卡的完整信息,是多網(wǎng)卡場景的最優(yōu)選擇。
1. 安裝依賴
# PyPI 安裝(推薦) pip install netifaces # 若 Windows 安裝失敗,可使用 conda 安裝 # conda install -c conda-forge netifaces
2. 完整代碼(獲取所有網(wǎng)卡詳細信息)
import netifaces
def get_all_network_adapters():
"""
獲取本機所有網(wǎng)卡的完整信息(IP+MAC+網(wǎng)卡名+子網(wǎng)掩碼)
返回格式:list[dict],每個字典對應(yīng)一個有效網(wǎng)卡
"""
network_adapters = []
# 獲取所有網(wǎng)卡接口名稱(如 eth0、WLAN、以太網(wǎng)等)
all_interfaces = netifaces.interfaces()
for interface in all_interfaces:
adapter_info = {
"網(wǎng)卡名稱": interface,
"IPv4 地址": None,
"子網(wǎng)掩碼": None,
"MAC 地址": None
}
# 1. 獲取 MAC 地址(AF_LINK 對應(yīng)鏈路層,即 MAC 地址)
try:
link_info = netifaces.ifaddresses(interface)[netifaces.AF_LINK][0]
adapter_info["MAC 地址"] = link_info["addr"]
except (KeyError, IndexError):
# 部分虛擬網(wǎng)卡可能無 MAC 地址,忽略異常
adapter_info["MAC 地址"] = "無"
# 2. 獲取 IPv4 地址和子網(wǎng)掩碼(AF_INET 對應(yīng) IPv4 協(xié)議)
try:
inet_info = netifaces.ifaddresses(interface)[netifaces.AF_INET][0]
adapter_info["IPv4 地址"] = inet_info["addr"]
adapter_info["子網(wǎng)掩碼"] = inet_info["netmask"]
except (KeyError, IndexError):
# 無 IPv4 地址的網(wǎng)卡(如虛擬網(wǎng)卡、未連接的網(wǎng)卡),忽略
adapter_info["IPv4 地址"] = "無"
adapter_info["子網(wǎng)掩碼"] = "無"
# 過濾無效網(wǎng)卡(無 IPv4 且無 MAC 的虛擬接口)
if adapter_info["IPv4 地址"] != "無" or adapter_info["MAC 地址"] != "無":
network_adapters.append(adapter_info)
return network_adapters
def print_network_info(adapters):
"""格式化輸出網(wǎng)卡信息"""
print("=== 本機所有網(wǎng)卡詳細信息(netifaces 方案)===\n")
for idx, adapter in enumerate(adapters, 1):
print(f"【網(wǎng)卡 {idx}】")
for key, value in adapter.items():
print(f" {key}:{value}")
print("-" * 50)
if __name__ == "__main__":
adapters = get_all_network_adapters()
print_network_info(adapters)
運行效果
=== 本機所有網(wǎng)卡詳細信息(netifaces 方案)=== 【網(wǎng)卡 1】 網(wǎng)卡名稱:以太網(wǎng) IPv4 地址:192.168.1.105 子網(wǎng)掩碼:255.255.255.0 MAC 地址:a1:b2:c3:d4:e5:f6 -------------------------------------------------- 【網(wǎng)卡 2】 網(wǎng)卡名稱:WLAN IPv4 地址:192.168.3.26 子網(wǎng)掩碼:255.255.255.0 MAC 地址:b2:c3:d4:e5:f6:a7 -------------------------------------------------- 【網(wǎng)卡 3】 網(wǎng)卡名稱:虛擬機網(wǎng)卡 IPv4 地址:192.168.100.5 子網(wǎng)掩碼:255.255.255.0 MAC 地址:c3:d4:e5:f6:a7:b8 --------------------------------------------------
核心 API 說明
netifaces.interfaces():返回所有網(wǎng)卡接口名稱列表netifaces.ifaddresses(interface):返回指定網(wǎng)卡的所有地址信息(字典格式)netifaces.AF_LINK:鏈路層地址(MAC 地址)netifaces.AF_INET:IPv4 地址信息netifaces.AF_INET6:IPv6 地址信息(如需支持,可參考 IPv4 邏輯擴展)
優(yōu)缺點
- ? 優(yōu)點:信息完整、多網(wǎng)卡精準匹配、跨平臺穩(wěn)定、易用性強
- ? 缺點:需要額外安裝第三方庫(僅需一行命令)
五、方案 3:系統(tǒng)命令調(diào)用(無依賴,兼容所有環(huán)境)
通過調(diào)用系統(tǒng)原生命令(Windows ipconfig /all、Linux/Mac ifconfig -a),解析輸出結(jié)果獲取 IP 和 MAC,適合無法安裝第三方庫的場景。
完整代碼
import subprocess
import re
import sys
def get_ip_mac_by_system_cmd():
"""
調(diào)用系統(tǒng)命令獲取 IP 和 MAC 地址(跨平臺兼容)
返回格式:list[dict]
"""
ip_mac_list = []
try:
if sys.platform == "win32":
# Windows 系統(tǒng):執(zhí)行 ipconfig /all,編碼用 gbk(避免中文亂碼)
result = subprocess.check_output(
"ipconfig /all",
shell=True,
encoding="gbk",
stderr=subprocess.STDOUT
)
# 正則匹配:網(wǎng)卡名稱、IPv4、MAC(物理地址)
adapter_pattern = r"(Ethernet adapter|Wireless LAN adapter).*?:(.*?)(?=\n\n|\Z)"
adapters = re.findall(adapter_pattern, result, re.DOTALL)
for adapter_type, adapter_content in adapters:
# 提取網(wǎng)卡名稱(如 "以太網(wǎng)"、"WLAN")
name_match = re.search(r"([^:]+)", adapter_content.strip())
name = name_match.group(1) if name_match else adapter_type
# 提取 IPv4 地址
ip_match = re.search(r"IPv4 地址.*?: ([\d.]+)", adapter_content)
ip = ip_match.group(1) if ip_match else "無"
# 提取 MAC 地址(物理地址)
mac_match = re.search(r"物理地址.*?: ([0-9A-Fa-f-]+)", adapter_content)
mac = mac_match.group(1).replace("-", ":") if mac_match else "無"
if ip != "無" and not ip.startswith("127."):
ip_mac_list.append({
"網(wǎng)卡名稱": name,
"IPv4 地址": ip,
"MAC 地址": mac
})
else:
# Linux/Mac 系統(tǒng):執(zhí)行 ifconfig -a,編碼用 utf-8
result = subprocess.check_output(
"ifconfig -a",
shell=True,
encoding="utf-8",
stderr=subprocess.STDOUT
)
# 正則匹配:網(wǎng)卡名、MAC(ether)、IPv4(inet)
interface_pattern = r"(\w+):.*?ether ([0-9a-f:]+).*?inet ([\d.]+)", re.DOTALL
matches = re.findall(interface_pattern, result)
for name, mac, ip in matches:
if not ip.startswith("127."):
ip_mac_list.append({
"網(wǎng)卡名稱": name,
"IPv4 地址": ip,
"MAC 地址": mac
})
except Exception as e:
print(f"獲取失敗:{str(e)}")
return ip_mac_list
if __name__ == '__main__':
print("=== 本機網(wǎng)絡(luò)信息(系統(tǒng)命令方案)===\n")
network_info = get_ip_mac_by_system_cmd()
for idx, info in enumerate(network_info, 1):
print(f"【網(wǎng)卡 {idx}】")
for key, value in info.items():
print(f" {key}:{value}")
print("-" * 50)
運行效果(Windows 示例)
=== 本機網(wǎng)絡(luò)信息(系統(tǒng)命令方案)=== 【網(wǎng)卡 1】 網(wǎng)卡名稱:以太網(wǎng) IPv4 地址:192.168.1.105 MAC 地址:a1:b2:c3:d4:e5:f6 -------------------------------------------------- 【網(wǎng)卡 2】 網(wǎng)卡名稱:WLAN IPv4 地址:192.168.3.26 MAC 地址:b2:c3:d4:e5:f6:a7 --------------------------------------------------
優(yōu)缺點
- ? 優(yōu)點:零依賴、兼容所有系統(tǒng)、無需額外安裝
- ? 缺點:需要解析命令輸出(正則易受系統(tǒng)語言影響)、信息不如 netifaces 完整
六、關(guān)鍵注意事項
- 權(quán)限問題:
- Linux/Mac 系統(tǒng)中,部分網(wǎng)卡信息可能需要
sudo權(quán)限(如ifconfig -a),建議運行時添加sudo。 - Windows 系統(tǒng)無需管理員權(quán)限,直接運行即可。
- 虛擬網(wǎng)卡過濾:
- 虛擬機(VMware、VirtualBox)、Docker 等會創(chuàng)建虛擬網(wǎng)卡,代碼中已過濾無 IP 的無效網(wǎng)卡,可根據(jù)需求調(diào)整過濾邏輯。
- 編碼問題:
- Windows 的
ipconfig /all輸出為 GBK 編碼,需指定encoding="gbk"避免中文亂碼。 - Linux/Mac 的
ifconfig輸出為 UTF-8 編碼,指定encoding="utf-8"即可。
- IPv6 支持:
- 若需獲取 IPv6 地址,可擴展
netifaces.AF_INET6(方案 2)或調(diào)整正則表達式(方案 3),邏輯與 IPv4 類似。
以上就是Python獲取本機所有網(wǎng)卡IP/MAC地址的三種方法的詳細內(nèi)容,更多關(guān)于Python獲取本機網(wǎng)卡IP/MAC地址的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python實現(xiàn)簡單的學生成績管理系統(tǒng)
這篇文章主要為大家詳細介紹了python實現(xiàn)簡單的學生成績管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02
如何優(yōu)雅地處理Django中的favicon.ico圖標詳解
默認情況下,瀏覽器訪問一個網(wǎng)站的時候,同時還會向服務(wù)器請求"/favicon.ico"這個URL,目的是獲取網(wǎng)站的圖標,下面這篇文章主要給大家介紹了關(guān)于如何優(yōu)雅地處理Django中favicon.ico圖標的相關(guān)資料,需要的朋友可以參考下2018-07-07
python爬取微信公眾號文章圖片并轉(zhuǎn)為PDF
大家好,本篇文章主要講的是python爬取微信公眾號文章圖片并轉(zhuǎn)為PDF,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下2022-02-02

