首页 > 技术文章 > python ipaddress模块简介

zywnnblog 2021-09-23 10:43 原文

文章目录
原著
概述
创建Address/Network/Interface
1. IP地址
2. 网段地址
3. 主机接口(CIDR)
Address/Network/Interface成员函数
获取ip地址的版本,ipv4或者ipv6:
从ip地址获取网络地址:
获取网段中地址数目:
ip_network.hosts迭代获取可用的主机地址(没有广播和0地址)
`netmask/hostmask`来获取网络/主机掩码:
ipv6简写/全写:
网段作为一个列表
比较
转换成字符串/整数
获取更多错误信息
原著
https://docs.python.org/3.7/howto/ipaddress.html

author: Peter Moody, Nick Coghlan

An introduction to the ipaddress module

概述
本文简单介绍了python自带的 ipaddress模块,只涉及了模块的基础部分,更多函数介绍,还是要参考模块的手册.

创建Address/Network/Interface
ipaddress模块是面向对象的。使用前先要创建相应对象。可以使用字符串或者整数来创建如下三种IP地址对象

注:此库支持ipv4和ipv6

1. IP地址
IP地址,或者叫主机地址,可以使用ipaddress.ip_address() 这个工厂类来创建,会根据传入的字符串自动的创建IPv4/IPv6地址:

 

 也可以使用正整数来创建地址,默认的,小于2^32认为是IPV4,大于则是IPv6地址:

 

 当然也可以用派生类IPv4Address/IPv6Address强制创建ipv4/ipv6地址:

 

 2. 网段地址

ip/mask表示一个网段,可以使用ip_network创建IPv4/IPv6:

 

 一个网段地址中,主机地址不能被设置,比如192.0.2.1/24就不是一个有效的网段,初始化时程序会抛出一个 ValueError异常. 可以设置参数strict=False来自动的把主机地址置0:

 

 如果使用一个整数来创建网段,则认为这个网段为单ip网段,掩码为32/128:

 

 As with addresses, creation of a particular kind of network can be forced by calling the class constructor directly instead of using the factory function.

3. 主机接口(CIDR)
通常用cidr表示某个网络中的某台主机,比如192.0.2.1/24表示192.0.2.0/24网络中的主机192.0.2.1。ipaddress模块提供了类接口ip_interface来定义一个主机cidr地址

 

 Address/Network/Interface成员函数

用上面接口定义了IPv(4|6)(Address|Network|Interface)对象,可以调用下面的成员函数来获取对象的一些属性.

获取ip地址的版本,ipv4或者ipv6:

 

 从ip地址获取网络地址:

 

 获取网段中地址数目:

 

 ip_network.hosts迭代获取可用的主机地址(没有广播和0地址)

 

 

 netmask/hostmask来获取网络/主机掩码:

 

 ipv6简写/全写:

 

 


注:对于ipv4地址,依然提供这两个方法,只是不做处理,原值返回,这样代码可以不区分的调用而不会产生异常

网段作为一个列表
一个网段可以通过索引获取主机地址:

 

 

 


可以判断某个ip是否在一个网段

# 参考代码

 

 

 可以写出如下优雅的代码

 

 

 


比较
ipaddress重载了>,<等比较运算符

 

 

 注:如果对比不是IPv4和IPv4或者和IPv6地址,会抛出TypeError异常

转换成字符串/整数

获取更多错误信息
如果使用类工厂来创建IPv4/IPv6对象时,遇到错误,只会抛出 ValueError异常,因为类工厂不知道要创建哪种类,所以错误提示不是特别明确。如果想得到更多错误信息,可以使用原始IPv4/IPv6类来创建对象,这样会抛出ValueError的子类,比如ipaddress.AddressValueError, ipaddress.NetmaskValueError来通知用户具体错误信息

The error messages are significantly more detailed when using the class constructors directly. For example:

 

 

 


因为这两个类都有共同的父类ValueError,所以你可以写如下代码:

 

 

 

————————————————
版权声明:本文为CSDN博主「juewuer」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/juewuer/article/details/88062827

推荐阅读