如何从接口获取物理接口IP地址

发布于 2021-01-29 19:17:59

到目前为止,我使用PyQt类所做的事情:

all_Addresses = QNetworkInterface.allAddresses()    #list-of-QHostAddress

for addr in all_Addresses:
    print(addr.toString())

输出:

172.16.0.186 - Virtual Interface IP address
192.168.10.2 - Physical interface IP address. I want this one.
127.0.0.1

使用socket

import socket
print(socket.gethostbyname(socket.gethostname()))

输出:

172.16.0.186 - When openVPN is on
192.168.10.2 - When its off
  1. 有没有办法区分它们?
  2. 可以使用普通的Python代替PyQt类吗?
  3. 如何获得IPv6地址?
关注者
0
被浏览
139
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您应该使用netifaces。它被设计为跨平台的,并且包含Windows专用代码以及可在不同UNIX
    / UNIX类平台上工作的各种通用版本。

    netifaces版本0.10.0开始,支持Python3。

    使用摘要

    >>> from netifaces import AF_INET, AF_INET6, AF_LINK, AF_PACKET, AF_BRIDGE
    >>> import netifaces as ni
    >>> ni.interfaces()
    ['lo', 'eth0', 'eth1', 'vboxnet0', 'dummy1']
    >>>
    >>> ni.ifaddresses('eth0')[AF_LINK]   # NOTE: AF_LINK is an alias for AF_PACKET
    [{'broadcast': 'ff:ff:ff:ff:ff:ff', 'addr': '00:02:55:7b:b2:f6'}]
    >>> ni.ifaddresses('eth0')[AF_INET]
    [{'broadcast': '172.16.161.7', 'netmask': '255.255.255.248', 'addr': '172.16.161.6'}]
    >>>
    >>> # eth0 ipv4 interface address
    >>> ni.ifaddresses('eth0')[AF_INET][0]['addr']
    '172.16.161.6'
    >>>>
    

    细节

    Windows支持:

    大多数MS Windows安装都不需要编译器。如果收到有关为Windows安装MS Visual C
    ++的警告,请非常小心,因为您需要将用于python的编译器版本与用于模块的编译器版本匹配。

    netifaces数据结构的详细示例:

    >>> import netifaces as ni
    >>> ni.interfaces()
    ['lo', 'eth0', 'eth1', 'vboxnet0', 'dummy1']
    >>> ni.ifaddresses('eth0')
    {
        17: [
            {
                'broadcast': 'ff:ff:ff:ff:ff:ff',
                'addr': '00:02:55:7b:b2:f6'
            }
        ],
        2: [
            {
                'broadcast': '172.16.161.7',
                'netmask': '255.255.255.248',
                'addr': '172.16.161.6'
            }
        ],
        10: [
            {
                'netmask': 'ffff:ffff:ffff:ffff::',
                'addr': 'fe80::202:55ff:fe7b:b2f6%eth0'
            }
        ]
    }
    >>> 
    >>> print(ni.ifaddresses.__doc__)
    Obtain information about the specified network interface.
    
    Returns a dict whose keys are equal to the address family constants,
    e.g. netifaces.AF_INET, and whose values are a list of addresses in
    that family that are attached to the network interface.
    >>>
    >>> # for the IPv4 address of eth0
    >>> ni.ifaddresses('eth0')[2][0]['addr']
    '172.16.161.6'
    

    用于索引协议的数字来自/usr/include/linux/socket.h(在Linux中)… 编辑
    :我的3.2内核在这里具有它们:/usr/src/linux-headers-3.2.0-4-common/include/linux/socket.h

    #define AF_INET         2       /* Internet IP Protocol         */
    #define AF_INET6        10      /* IP version 6                 */
    #define AF_PACKET       17      /* Packet family                */
    

    好消息是您不必记住所有这些标头常量,它们包含在netifaces中

    >>> from netifaces import AF_INET, AF_INET6, AF_LINK, AF_PACKET, AF_BRIDGE
    >>> import netifaces as ni
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看