python - 从 IP 地址获取子网

标签 python python-3.x ip-address

我正在尝试获取我拥有的 IP 地址的子网。

例如:

1

子网掩码:255.255.255.0

输入:192.178.2.55

输出:192.178.2.0

2

子网掩码:255.255.0.0

输入:192.178.2.55

输出:192.178.0.0

目前,我这样做的方式(子网 255.255.255.0)

ip =  '192.178.2.55'
subnet = '.'.join(ip.split('.')[:2]) + '.0.0'
subnet
'192.178.0.0'

我看到 python 有 ipaddress 库。但是我找不到可以完成上述任务的方法。

好处:由于 ipaddress 支持 IPv4 和 IPv6,如果可以对两者使用相同的函数。

最佳答案

ipaddress.ip_network函数可以采用 IPv4NetworkIPv6Network 可以采用的任何字符串格式,包括 address/mask 格式。

由于您实际上并没有传递网络地址,而是该网络中设置了主机位的地址,因此您需要使用 strict=False

所以:

>>> net = ipaddress.ip_network('192.178.2.55/255.255.255.0', strict=False)
>>> net
IPv4Network('192.178.2.0/24')
>>> net.network_address
IPv4Address('192.178.2.0')
>>> net.netmask
IPv4Address('255.255.255.0')

或者,您可以使用 ip_interface并从那里提取网络:

>>> iface = ipaddress.ip_interface('192.178.2.55/255.255.255.0')
>>> iface
IPv4Interface('192.178.2.55/24')
>>> iface.network
IPv4Network('192.178.2.0/24')
>>> iface.netmask
IPv4Address('255.255.255.0')
>>> iface.ip
IPv4Address('192.178.2.55')
>>> iface.network.network_address
IPv4Address('192.178.2.0')

您想要两者中的哪一个取决于您想要表达的内容。请注意,Interface 类型是 Address 类型的子类,当然它们会记住用于构造它们的原始地址,而 Network 类会记住网络地址;这两者之一通常是决定因素。

当然,它们都可以与 IPv6 一起工作:

>>> ipaddress.ip_interface('2001:db8::1000/32')
IPv6Interface('2001:db8::1000/32')
>>> ipaddress.ip_interface('2001:db8::1000/32').network.network_address
IPv6Address('2001:db8::')

关于python - 从 IP 地址获取子网,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50867435/

相关文章:

python - OSError : [WinError 10013] error in Windows 10

python-3.x - 无法从 torchvision.models.resnet 导入 "BasicBlock"

python - python中的列表赋值

php - 如何在 PHP 中编写检查访问者 IP 地址的功能?

python - 属性错误: 'str' object has no attribute 'cumsum'

python - Airflow 中是否有运算符可以根据 BigQuery 中的查询创建表?

python - 使用python对列表中的项目进行分类

python - 值错误 : '10.0.0.0/24' does not appear to be an IPv4 or IPv6 network

grails - 如何运行 Grails 应用程序以便网络上的其他计算机可以访问它?

python - 如何检查正在执行的 Python 脚本的哪一行?