【问题标题】:Python cidr net address handling with standard lib使用标准库处理 Python cidr 网络地址
【发布时间】:2021-05-02 20:11:50
【问题描述】:

需求很简单:从单个 cidr 格式的 IPv4 地址(例如:“192.168.80.22/24”)中提取相关信息:

  • 地址:“192.168.80.22”
  • 网络:“192.168.80.0”
  • 网络掩码:“255.255.255.0”
  • 广播:“192.168.80.255”

是否有一种“简单的方法”来做到这一点(“简单”,在这种情况下意味着“没有实际编写解析器”),可能只使用 Python 标准库(我 认为 @987654321 @ 不能这样做,但我可能误读了文档)

认为 ipaddress 无法处理的原因我试过了:

>>> import ipaddress
>>> ip = ipaddress.ip_address("192.168.80.22/24")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.9/ipaddress.py", line 53, in ip_address
ValueError: '192.168.80.22/24' does not appear to be an IPv4 or IPv6 address
>>> ip = ipaddress.ip_address("192.168.80.22")
>>> ip = ipaddress.ip_network("192.168.80.22/24")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.9/ipaddress.py", line 74, in ip_network
  File "/usr/lib/python3.9/ipaddress.py", line 1504, in __init__
ValueError: 192.168.80.22/24 has host bits set
>>> ip = ipaddress.ip_network("192.168.80.0/24")

显然主机地址和网络地址不能混用

【问题讨论】:

  • 是的,我认为ipaddress 模块可以做到这一点。你试过什么?
  • @Barmar:我更新了 O.P.,谢谢。

标签: python python-3.x ipv4 cidr


【解决方案1】:

你可以使用ipaddress.ip_interface如下:

>>> import ipaddress
>>> 
>>> host4 = ipaddress.ip_interface("192.168.80.22/24")
>>>
>>> host4.ip                       
IPv4Address('192.168.80.22')       # address
>>> host4.network.network_address
IPv4Address('192.168.80.0')        # network
>>> host4.netmask 
IPv4Address('255.255.255.0')       # netmask
>>> host4.network.broadcast_address
IPv4Address('192.168.80.255')      # broadcast

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-04
    • 1970-01-01
    • 1970-01-01
    • 2015-09-27
    • 2021-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多