每周一个 Python 模块 | ipaddress

简介: ipaddress模块包括用于处理 IPv4 和 IPv6 网络地址的类。这些类支持验证,查找网络上的地址和主机以及其他常见操作。

ipaddress模块包括用于处理 IPv4 和 IPv6 网络地址的类。这些类支持验证,查找网络上的地址和主机以及其他常见操作。


地址


最基本的对象代表网络地址本身。传递字符串,整数或字节序列给 ip_address() 来构造地址。返回值是 IPv4AddressIPv6Address 实例,具体取决于所使用的地址类型。


import binascii
import ipaddress
ADDRESSES = [
    '10.9.0.6',
    'fdfd:87b5:b475:5e3e:b1bc:e121:a8eb:14aa',
]
for ip in ADDRESSES:
    addr = ipaddress.ip_address(ip)
    print('{!r}'.format(addr))
    print('   IP version:', addr.version)
    print('   is private:', addr.is_private)
    print('  packed form:', binascii.hexlify(addr.packed))
    print('      integer:', int(addr))
    print()
# output
# IPv4Address('10.9.0.6')
#    IP version: 4
#    is private: True
#   packed form: b'0a090006'
#       integer: 168361990
# 
# IPv6Address('fdfd:87b5:b475:5e3e:b1bc:e121:a8eb:14aa')
#    IP version: 6
#    is private: True
#   packed form: b'fdfd87b5b4755e3eb1bce121a8eb14aa'
#       integer: 337611086560236126439725644408160982186
复制代码


还可以用这个方法来校验 IP 地址是否合法:


import ipaddress
def  is_ip_Valid(ipaddr):
    try:
        ipaddress.ip_address(ipaddr);
        return True;
    except :
        return False;
if __name__ == '__main__':
    print(is_ip_Valid('2001:db8::'));
    print(is_ip_Valid('192.168.168.1'));
复制代码


网络


网络是由一系列地址组成的,通常用地址和掩码这种形式来表示。


import ipaddress
NETWORKS = [
    '10.9.0.0/24',
    'fdfd:87b5:b475:5e3e::/64',
]
for n in NETWORKS:
    net = ipaddress.ip_network(n)
    print('{!r}'.format(net))
    print('     is private:', net.is_private)
    print('      broadcast:', net.broadcast_address)
    print('     compressed:', net.compressed)
    print('   with netmask:', net.with_netmask)
    print('  with hostmask:', net.with_hostmask)
    print('  num addresses:', net.num_addresses)
    print()
# output
# IPv4Network('10.9.0.0/24')
#      is private: True
#       broadcast: 10.9.0.255
#      compressed: 10.9.0.0/24
#    with netmask: 10.9.0.0/255.255.255.0
#   with hostmask: 10.9.0.0/0.0.0.255
#   num addresses: 256
# 
# IPv6Network('fdfd:87b5:b475:5e3e::/64')
#      is private: True
#       broadcast: fdfd:87b5:b475:5e3e:ffff:ffff:ffff:ffff
#      compressed: fdfd:87b5:b475:5e3e::/64
#    with netmask: fdfd:87b5:b475:5e3e::/ffff:ffff:ffff:ffff::
#   with hostmask: fdfd:87b5:b475:5e3e::/::ffff:ffff:ffff:ffff
#   num addresses: 18446744073709551616
复制代码


与地址一样,IPv4 和 IPv6网络有两种网络类。每个类提供用于访问与网络相关联的值的属性或方法,例如广播地址和可供主机使用的网络上的地址。

网络实例是可迭代的,并产生网络上的地址。


import ipaddress
NETWORKS = [
    '10.9.0.0/24',
    'fdfd:87b5:b475:5e3e::/64',
]
for n in NETWORKS:
    net = ipaddress.ip_network(n)
    print('{!r}'.format(net))
    for i, ip in zip(range(3), net):
        print(ip)
    print()
# output
# IPv4Network('10.9.0.0/24')
# 10.9.0.0
# 10.9.0.1
# 10.9.0.2
# 
# IPv6Network('fdfd:87b5:b475:5e3e::/64')
# fdfd:87b5:b475:5e3e::
# fdfd:87b5:b475:5e3e::1
# fdfd:87b5:b475:5e3e::2
复制代码


此示例仅打印一些地址,因为 IPv6 网络可以包含的地址远多于输出中的地址。

迭代网络会产生地址,但并非所有地址都对主机有效。例如,网络的基地址和广播地址。要查找网络上常规主机可以使用的地址,请使用 hosts() 方法,该方法会生成一个生成器。


import ipaddress
NETWORKS = [
    '10.9.0.0/24',
    'fdfd:87b5:b475:5e3e::/64',
]
for n in NETWORKS:
    net = ipaddress.ip_network(n)
    print('{!r}'.format(net))
    for i, ip in zip(range(3), net.hosts()):
        print(ip)
    print()
# output
# IPv4Network('10.9.0.0/24')
# 10.9.0.1
# 10.9.0.2
# 10.9.0.3
# 
# IPv6Network('fdfd:87b5:b475:5e3e::/64')
# fdfd:87b5:b475:5e3e::1
# fdfd:87b5:b475:5e3e::2
# fdfd:87b5:b475:5e3e::3
复制代码


将此示例的输出与前一示例进行比较表明,主机地址不包括在整个网络上进行迭代时生成的第一个值。

除了迭代器协议之外,网络还支持in 操作,来确定地址是否是网络的一部分。


import ipaddress
NETWORKS = [
    ipaddress.ip_network('10.9.0.0/24'),
    ipaddress.ip_network('fdfd:87b5:b475:5e3e::/64'),
]
ADDRESSES = [
    ipaddress.ip_address('10.9.0.6'),
    ipaddress.ip_address('10.7.0.31'),
    ipaddress.ip_address('fdfd:87b5:b475:5e3e:b1bc:e121:a8eb:14aa'),
    ipaddress.ip_address('fe80::3840:c439:b25e:63b0'),
]
for ip in ADDRESSES:
    for net in NETWORKS:
        if ip in net:
            print('{}\nis on {}'.format(ip, net))
            break
    else:
        print('{}\nis not on a known network'.format(ip))
    print()
# output
# 10.9.0.6
# is on 10.9.0.0/24
# 
# 10.7.0.31
# is not on a known network
# 
# fdfd:87b5:b475:5e3e:b1bc:e121:a8eb:14aa
# is on fdfd:87b5:b475:5e3e::/64
# 
# fe80::3840:c439:b25e:63b0
# is not on a known network
复制代码


in使用网络掩码来测试地址,因此它比扩展网络上的完整地址列表更有效。


接口


网络接口表示网络上的特定地址,并且可以由主机地址和网络前缀或网络掩码表示。


import ipaddress
ADDRESSES = [
    '10.9.0.6/24',
    'fdfd:87b5:b475:5e3e:b1bc:e121:a8eb:14aa/64',
]
for ip in ADDRESSES:
    iface = ipaddress.ip_interface(ip)
    print('{!r}'.format(iface))
    print('network:\n  ', iface.network)
    print('ip:\n  ', iface.ip)
    print('IP with prefixlen:\n  ', iface.with_prefixlen)
    print('netmask:\n  ', iface.with_netmask)
    print('hostmask:\n  ', iface.with_hostmask)
    print()
# output
# IPv4Interface('10.9.0.6/24')
# network:
#    10.9.0.0/24
# ip:
#    10.9.0.6
# IP with prefixlen:
#    10.9.0.6/24
# netmask:
#    10.9.0.6/255.255.255.0
# hostmask:
#    10.9.0.6/0.0.0.255
# 
# IPv6Interface('fdfd:87b5:b475:5e3e:b1bc:e121:a8eb:14aa/64')
# network:
#    fdfd:87b5:b475:5e3e::/64
# ip:
#    fdfd:87b5:b475:5e3e:b1bc:e121:a8eb:14aa
# IP with prefixlen:
#    fdfd:87b5:b475:5e3e:b1bc:e121:a8eb:14aa/64
# netmask:
#    fdfd:87b5:b475:5e3e:b1bc:e121:a8eb:14aa/ffff:ffff:ffff:ffff::
# hostmask:
#    fdfd:87b5:b475:5e3e:b1bc:e121:a8eb:14aa/::ffff:ffff:ffff:ffff
复制代码


接口对象具有分别访问完整网络和地址的属性,以及表达接口和网络掩码的几种不同方式。


目录
相关文章
|
27天前
|
开发者 Python
如何在Python中管理模块和包的依赖关系?
在实际开发中,通常会结合多种方法来管理模块和包的依赖关系,以确保项目的顺利进行和可维护性。同时,要及时更新和解决依赖冲突等问题,以保证代码的稳定性和可靠性
44 4
|
7天前
|
Python
Python Internet 模块
Python Internet 模块。
102 74
|
25天前
|
算法 数据安全/隐私保护 开发者
马特赛特旋转算法:Python的随机模块背后的力量
马特赛特旋转算法是Python `random`模块的核心,由松本真和西村拓士于1997年提出。它基于线性反馈移位寄存器,具有超长周期和高维均匀性,适用于模拟、密码学等领域。Python中通过设置种子值初始化状态数组,经状态更新和输出提取生成随机数,代码简单高效。
104 63
|
27天前
|
测试技术 Python
手动解决Python模块和包依赖冲突的具体步骤是什么?
需要注意的是,手动解决依赖冲突可能需要一定的时间和经验,并且需要谨慎操作,避免引入新的问题。在实际操作中,还可以结合使用其他方法,如虚拟环境等,来更好地管理和解决依赖冲突😉。
|
27天前
|
持续交付 Python
如何在Python中自动解决模块和包的依赖冲突?
完全自动解决所有依赖冲突可能并不总是可行,特别是在复杂的项目中。有时候仍然需要人工干预和判断。自动解决的方法主要是提供辅助和便捷,但不能完全替代人工的分析和决策😉。
|
1月前
|
JSON Linux 数据格式
Python模块:从入门到精通,只需一篇文章!
Python中的模块是将相关代码组织在一起的单元,便于重用和维护。模块可以是Python文件或C/C++扩展,Python标准库中包含大量模块,如os、sys、time等,用于执行各种任务。定义模块只需创建.py文件并编写代码,导入模块使用import语句。此外,Python还支持自定义模块和包,以及虚拟环境来管理项目依赖。
Python模块:从入门到精通,只需一篇文章!
|
27天前
|
Python
Python的模块和包
总之,模块和包是 Python 编程中非常重要的概念,掌握它们可以帮助我们更好地组织和管理代码,提高开发效率和代码质量
38 5
|
27天前
|
数据可视化 Python
如何在Python中解决模块和包的依赖冲突?
解决模块和包的依赖冲突需要综合运用多种方法,并且需要团队成员的共同努力和协作。通过合理的管理和解决冲突,可以提高项目的稳定性和可扩展性
|
1月前
|
Python
在Python中,可以使用内置的`re`模块来处理正则表达式
在Python中,可以使用内置的`re`模块来处理正则表达式
47 5
|
1月前
|
Java 程序员 开发者
Python的gc模块
Python的gc模块