专栏首页python3Python获取本机 IP/MAC(多网

Python获取本机 IP/MAC(多网

  Python获取本机IP地址的一般方法为

import socket

IP = socket.gethostbyname(socket.gethostname())

  通过gethostname获取主机名,再用gethostbyname将主机名转换为IP地址。

  那么,问题来了。如果主机有多个网卡/IP,怎样获取某个指定的IP地址呢?

  一个方法是通过socket.gethostbyname_ex获取主机IP地址列表,然后遍历列表取得自己需要的IP。

import socket

#多网卡情况下,根据前缀获取IP(Windows 下适用)
def GetLocalIPByPrefix(prefix):
	localIP = ''
	for ip in socket.gethostbyname_ex(socket.gethostname())[2]:
		if ip.startswith(prefix):
			localIP = ip
	
	return localIP
	
	
print(GetLocalIPByPrefix('192.168'))

  更简单的方法(不用修改代码,还是用socket.gethostname函数),是通过配置hosts文件改变IP优先级。

  上面的方法只支持IPv4,如果要获取IPv6信息,参考socket.getaddrinfo

*** Updated 2018-03-08 ***

1、用系统库获取单机 mac 地址。

import uuid

# 针对单网卡
def GetMAC():
	addr = hex(uuid.getnode())[2:].upper()
	
	return '-'.join(addr[i:i+2] for i in range(0, len(addr), 2))

2、用第三方库 psutil 打印网络适配器信息。

import psutil

# 打印多网卡 mac 和 ip 信息
def PrintNetIfAddr():
    dic = psutil.net_if_addrs()
    for adapter in dic:
        snicList = dic[adapter]
        mac = '无 mac 地址'
        ipv4 = '无 ipv4 地址'
        ipv6 = '无 ipv6 地址'
        for snic in snicList:
            if snic.family.name in {'AF_LINK', 'AF_PACKET'}:
                mac = snic.address
            elif snic.family.name == 'AF_INET':
                ipv4 = snic.address
            elif snic.family.name == 'AF_INET6':
                ipv6 = snic.address
        print('%s, %s, %s, %s' % (adapter, mac, ipv4, ipv6))

*** Updated 2018-07-28 ***

  • 跨平台的根据前缀获取 ip 的方法
import psutil

# 多网卡情况下,根据前缀获取IP
# 测试可用:Windows、Linux,Python 3.6.x,psutil 5.4.x
# ipv4/ipv6 地址均适用
# 注意如果有多个相同前缀的 ip,只随机返回一个
def GetLocalIPByPrefix(prefix):
	localIP = ''
	dic = psutil.net_if_addrs()
	for adapter in dic:
		snicList = dic[adapter]
		for snic in snicList:
			if not snic.family.name.startswith('AF_INET'):
				continue				
			ip = snic.address
			if ip.startswith(prefix):
				localIP = ip
	 
	return localIP
	 
	 
print(GetLocalIPByPrefix('192.168'))

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python if else单行

    py3study
  • 调用python-nmap实现扫描局域网

    使用环境:Raspberry 3b+ +netifaces+python-nmap+nmap

    py3study
  • P-1.5 Python跳出多层循环的方

    “else在 while和for 正常循环完成之后执行,和直接写在 while和for 之后没有区别,但是如果用break结束循环之后else就不会执行了。” ...

    py3study
  • VMware 虚拟机NAT模式如何设置网络连接,从头到尾全过程

    3.网卡开启后设置ip地址,此处设置的ip和本机的ip没有关系,设置成你虚拟机里面运行的计算机需要的ip地址网段

    Python之道
  • 1081 检查密码 (15 分)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    韩旭051
  • 通过源码理解IGMP v1的实现(基于linux1.2.13)

    IGMP是组成员管理协议,我们知道一般的通信是单播的,虽然主机发出的单播报文,局域网中的每个主机都会收到,但是默认情况下,主机只会处理目的ip是自己的报文。如果...

    theanarkh
  • 网易领投,AxonVR获VR触感技术领域最大融资额——580万美金

    VRPinea
  • 使用ABAP实现Mock测试工具Mockito

    Mockito is a mocking framework, JAVA-based library that is used for effective un...

    Jerry Wang
  • 1934: [Shoi2007]Vote 善意的投票

    1934: [Shoi2007]Vote 善意的投票 Time Limit: 1 Sec  Memory Limit: 64 MB Submit: 1174  ...

    HansBug
  • 1637: [Usaco2007 Mar]Balanced Lineup

    1637: [Usaco2007 Mar]Balanced Lineup Time Limit: 5 Sec  Memory Limit: 64 MB Subm...

    HansBug

扫码关注云+社区

领取腾讯云代金券