如何检查Python中的另一个网络中是否包含一个网络?

pla*_*etp 5 python networking python-3.x

如何检查网络是否完全包含在Python的另一个网络中(例如,是否10.11.12.0/24在)10.11.0.0/16

我试过使用,ipaddress但不起作用:

>>> import ipaddress
>>> ipaddress.ip_network('10.11.12.0/24') in ipaddress.ip_network('10.11.0.0/16')
False
Run Code Online (Sandbox Code Playgroud)

SIs*_*lam 5

尝试 netaddr如下 -

检查一个网络是否在另一个网络中

from netaddr import IPNetwork,IPAddress

if IPNetwork("10.11.12.0/24") in IPNetwork("10.11.0.0/16"):
    print "Yes it is!"
Run Code Online (Sandbox Code Playgroud)

检查IP是否在网络中

from netaddr import IPNetwork,IPAddress

if IPAddress("10.11.12.0") in IPNetwork("10.11.0.0/16"):
    print "Yes it is!"
Run Code Online (Sandbox Code Playgroud)


Hug*_*ell 5

import ipaddress

def is_subnet_of(a, b):
   """
   Returns boolean: is `a` a subnet of `b`?
   """
   a = ipaddress.ip_network(a)
   b = ipaddress.ip_network(b)
   a_len = a.prefixlen
   b_len = b.prefixlen
   return a_len >= b_len and a.supernet(a_len - b_len) == b
Run Code Online (Sandbox Code Playgroud)

然后

is_subnet_of("10.11.12.0/24", "10.11.0.0/16")   # => True
Run Code Online (Sandbox Code Playgroud)


Eug*_*ash 5

从Python的开始3.7.0可以使用subnet_of()supernet_of()方法ipaddress.IPv6Network,并ipaddress.IPv4Network用于网络测试遏制:

>>> from ipaddress import ip_network
>>> a = ip_network('192.168.1.0/24')
>>> b = ip_network('192.168.1.128/30')
>>> b.subnet_of(a)
True
>>> a.supernet_of(b)
True
Run Code Online (Sandbox Code Playgroud)

如果您的Python版本是3.7.0之前的版本,则可以从该模块的更高版本中复制该方法的代码