ipaddress 模块介绍


在python 3.8文档 Python 常用指引中已经详细介绍了 ipaddress模块,此处为引用官方文档

创建 Address/Network/Interface 对象

因为 ipaddress 是一个用于检查和操作 IP 地址的模块,你要做的第一件事就是创建一些对象。 您可以使用 ipaddress 从字符串和整数创建对象。

关于IP版本的说明

对于不太熟悉 IP 寻址的读者,重要的是要知道 Internet 协议当前正在从协议的版本4转移到版本6。转换很大程度上是因为协议的版本4没有提供足够的地址来满足整个世界的需求,特别是考虑到越来越多的设备直接连接到互联网。

解释协议的两个版本之间的差异的细节超出了本介绍的范围,但读者需要至少知道存在这两个版本,并且有时需要强制使用一个版本或其他版本。

IP主机地址

通常称为“主机地址”的地址是使用IP寻址时最基本的单元。 创建地址的最简单方法是使用 ipaddress.ip_address() 工厂函数,该函数根据传入的值自动确定是创建 IPv4 还是 IPv6 地址:

>>> ipaddress.ip_address('192.0.2.1')
IPv4Address('192.0.2.1')
>>> ipaddress.ip_address('2001:DB8::1')
IPv6Address('2001:db8::1')

地址也可以直接从整数创建,适配32位的值并假定为IPv4地址:

>>> ipaddress.ip_address(3221225985)
IPv4Address('192.0.2.1')
>>> ipaddress.ip_address(42540766411282592856903984951653826561)
IPv6Address('2001:db8::1')

要强制使用IPv4或IPv6地址,可以直接调用相关的类。 这对于强制为小整数创建IPv6地址特别有用:

>>> ipaddress.ip_address(1)
IPv4Address('0.0.0.1')
>>> ipaddress.IPv4Address(1)
IPv4Address('0.0.0.1')
>>> ipaddress.IPv6Address(1)
IPv6Address('::1')

定义网络

主机地址通常组合在一起形成IP网络,因此 ipaddress 提供了一种创建、检查和操作网络定义的方法。 IP网络对象由字符串构成,这些字符串定义作为该网络一部分的主机地址范围。 该信息的最简单形式是“网络地址/网络前缀”对,其中前缀定义了比较的前导比特数,以确定地址是否是网络的一部分,并且网络地址定义了那些位的预期值。

对于地址,提供了一个自动确定正确IP版本的工厂函数:

>>> ipaddress.ip_network('192.0.2.0/24')
IPv4Network('192.0.2.0/24')
>>> ipaddress.ip_network('2001:db8::0/96')
IPv6Network('2001:db8::/96')

网络对象不能设置任何主机位。 这样做的实际效果是192.0.2.1/24没有描述网络。 这种定义被称为接口对象,因为网络上IP表示法通常用于描述给定网络上的计算机的网络接口,并在下一节中进一步描述。

默认情况下,尝试创建一个设置了主机位的网络对象将导致 ValueError 被引发。 要请求将附加位强制为零,可以将标志strict=False 传递给构造函数:

>>> ipaddress.ip_network('192.0.2.1/24')
Traceback (most recent call last):...
ValueError: 192.0.2.1/24 has host bits set
>>> ipaddress.ip_network('192.0.2.1/24', strict=False)
IPv4Network('192.0.2.0/24')

虽然字符串形式提供了更大的灵活性,但网络也可以用整数定义,就像主机地址一样。 在这种情况下,网络被认为只包含由整数标识的单个地址,因此网络前缀包括整个网络地址:

>>> ipaddress.ip_network(3221225984)
IPv4Network('192.0.2.0/32')
>>> ipaddress.ip_network(42540766411282592856903984951653826560)
IPv6Network('2001:db8::/128')

与地址一样,可以通过直接调用类构造函数而不是使用工厂函数来强制创建特定类型的网络。

主机接口

如上所述,如果您需要描述特定网络上的地址,则地址和网络类都不够。 像 192.0.2.1/24 这样的表示法通常被网络工程师和为防火墙和路由器编写工具的人用作“ 192.0.2.0/24 网络上的主机 192.0.2.1 ”的简写。因此,ipaddress 提供了一组将地址与特定网络相关联的混合类。用于创建的接口与用于定义网络对象的接口相同,除了地址部分不限于是网络地址。

>>> ipaddress.ip_interface('192.0.2.1/24')
IPv4Interface('192.0.2.1/24')
>>> ipaddress.ip_interface('2001:db8::1/96')
IPv6Interface('2001:db8::1/96')

接受整数输入(与网络一样),并且可以通过直接调用相关构造函数来强制使用特定IP版本。

审查 Address/Network/Interface 对象

你已经遇到了创建IPv(4|6)(Address|Network|Interface) 对象的麻烦,因此你可能希望获得有关它的信息。 ipaddress 试图让这个过程变得简单直观。

提取 IP 版本:

>>> addr4 = ipaddress.ip_address('192.0.2.1')
>>> addr6 = ipaddress.ip_address('2001:db8::1')
>>> addr6.version
6
>>> addr4.version
4

从接口获取网络:

>>> host4 = ipaddress.ip_interface('192.0.2.1/24')
>>> host4.network
IPv4Network('192.0.2.0/24')
>>> host6 = ipaddress.ip_interface('2001:db8::1/96')
>>> host6.network
IPv6Network('2001:db8::/96')

找出网络中有多少独立地址:

>>> net4 = ipaddress.ip_network('192.0.2.0/24')
>>> net4.num_addresses
256
>>> net6 = ipaddress.ip_network('2001:db8::0/96')
>>> net6.num_addresses
4294967296

迭代网络上的“可用”地址:

>>> net4 = ipaddress.ip_network('192.0.2.0/24')
>>> for x in net4.hosts():
...     print(x)
192.0.2.1
192.0.2.2
192.0.2.3
192.0.2.4
...
192.0.2.252
192.0.2.253
192.0.2.254

获取网络掩码(即对应于网络前缀的设置位)或主机掩码(不属于网络掩码的任何位):

>>> net4 = ipaddress.ip_network('192.0.2.0/24')
>>> net4.netmask
IPv4Address('255.255.255.0')
>>> net4.hostmask
IPv4Address('0.0.0.255')
>>> net6 = ipaddress.ip_network('2001:db8::0/96')
>>> net6.netmask
IPv6Address('ffff:ffff:ffff:ffff:ffff:ffff::')
>>> net6.hostmask
IPv6Address('::ffff:ffff')

展开或压缩地址:

>>> addr6.exploded
'2001:0db8:0000:0000:0000:0000:0000:0001'
>>> addr6.compressed
'2001:db8::1'
>>> net6.exploded
'2001:0db8:0000:0000:0000:0000:0000:0000/96'
>>> net6.compressed
'2001:db8::/96'

虽然IPv4不支持展开或压缩,但关联对象仍提供相关属性,因此版本中性代码可以轻松确保最简洁或最详细的形式用于IPv6地址,同时仍能正确处理IPv4地址。

Network 作为 Address 列表

将网络视为列表有时很有用。 这意味着它可以像这样索引它们:

>>> net4[1]
IPv4Address('192.0.2.1')
>>> net4[-1]
IPv4Address('192.0.2.255')
>>> net6[1]
IPv6Address('2001:db8::1')
>>> net6[-1]
IPv6Address('2001:db8::ffff:ffff')

它还意味着网络对象可以使用像这样的列表成员测试语法:

if address in network:# do something

根据网络前缀有效地完成包含性测试:

>>> addr4 = ipaddress.ip_address('192.0.2.1')
>>> addr4 in ipaddress.ip_network('192.0.2.0/24')
True
>>> addr4 in ipaddress.ip_network('192.0.3.0/24')
False

比较

ipaddress 有意义地提供了一些简单、希望直观的比较对象的方法:

>>> ipaddress.ip_address('192.0.2.1') < ipaddress.ip_address('192.0.2.2')
True

如果你尝试比较不同版本或不同类型的对象,则会引发 TypeError 异常。

将IP地址与其他模块一起使用

其他使用IP地址的模块(例如 socket )通常不会直接接受来自该模块的对象。 相反,它们必须被强制转换为另一个模块可接受的整数或字符串:

>>> addr4 = ipaddress.ip_address('192.0.2.1')
>>> str(addr4)
'192.0.2.1'
>>> int(addr4)
3221225985

实例创建失败时获取更多详细信息

使用与版本无关的工厂函数创建 address/network/interface 对象时,任何错误都将报告为 ValueError ,带有一般错误消息,只是说传入的值未被识别为该类型的对象。 缺少特定错误是因为有必要知道该值是假设是IPv4还是IPv6,以便提供有关其被拒绝原因的更多详细信息。

为了支持访问这些额外细节的用例,各个类构造函数实际上引发了 ValueError 子类 ipaddress.AddressValueErroripaddress.NetmaskValueError 以准确指示定义的哪一部分无法正确解析。

直接使用类构造函数时,错误消息更加详细。 例如:

>>> ipaddress.ip_address("192.168.0.256")
Traceback (most recent call last):...
ValueError: '192.168.0.256' does not appear to be an IPv4 or IPv6 address
>>> ipaddress.IPv4Address("192.168.0.256")
Traceback (most recent call last):...
ipaddress.AddressValueError: Octet 256 (> 255) not permitted in '192.168.0.256'>>> ipaddress.ip_network("192.168.0.1/64")
Traceback (most recent call last):...
ValueError: '192.168.0.1/64' does not appear to be an IPv4 or IPv6 network
>>> ipaddress.IPv4Network("192.168.0.1/64")
Traceback (most recent call last):...
ipaddress.NetmaskValueError: '64' is not a valid netmask

但是,两个模块特定的异常都有 ValueError 作为它们的父类,所以如果你不关心特定类型的错误,你仍然可以编写如下代码:

try:network = ipaddress.IPv4Network(address)
except ValueError:print('address/netmask is invalid for IPv4:', address)

ipaddress 模块介绍相关推荐

  1. python ipaddress模块简介

    文章目录 原著 概述 创建Address/Network/Interface 1. IP地址 2. 网段地址 3. 主机接口(CIDR) Address/Network/Interface成员函数 获 ...

  2. 爬虫之requests模块介绍

    爬虫之requests模块介绍 requests文档http://docs.python-requests.org/zh_CN/latest/index.html      [文档中包括的快速上手要精 ...

  3. Zynq器件XADC模块介绍

    1.前言 赛灵思的7系列FPGA和Zynq器件创造性地在片上集成了模数转换器和相关的片上传感器(内置温度传感器和功耗传感器),这是相比赛灵思前一代产品来新增加的特性,可在系统设计中免去外置的ADC器件 ...

  4. python3 ipaddress模块 创建 检查 操作ip地址 简介

    目录 1.创建地址对象--ipaddress.ip_address()函数 2.定义ip网络--ipaddress.ip_network()函数 3.查看网络中独立地址个数 4.打印主机地址 5.获取 ...

  5. python模块介绍-locustio:性能测试工具locustio

    转自:http://automationtesting.sinaapp.com/blog/m_locustio_doc python测试文章 http://weibo.com/cizhenshi?is ...

  6. 【收藏】GeoMesa整体架构模块介绍、创建Schema并导入数据

    geomesa-accumulo:基于 Apache Accumulo的DataStore 实现 geomesa-archetypes: Maven构建模板 geomesa-arrow: 基于 Apa ...

  7. 两款【linux字符界面下】显示【菜单】,【选项】的powershell脚本模块介绍

    两款[linux字符界面下]显示[菜单],[选项]的powershell脚本模块介绍 powershell linux  ps1 menu choice Multiselect 传教士 菜单 powe ...

  8. Spring之旅—Spring模块介绍

    1.0  Spring模块介绍 核心容器(Spring Core) 核心容器提供Spring框架的基本功能.Spring以bean的方式组织和管理Java应用中的各个组件及其关系.Spring使用Be ...

  9. EBS模块介绍和概念解释

    Oracle模块介绍和概念解释 Oracle重要模块简介 账套 会议科目表 记账本位币 会议日历的财务报告实体 组织 业务组 公司的最高部门 法人实体 提交财务和税务报表的法人公司 经营单位 orac ...

最新文章

  1. 又一Attention函数诞生啦,带给你意想不到的巨大提升!
  2. SpringBoot集成JPA根据实体类自动生成表
  3. 【忘川风华录】雅社——公会社交系统交互设计思考
  4. BZOJ 1997: [Hnoi2010]Planar( 2sat )
  5. openoffice 安装 linux环境
  6. SqlSessionTemplate是如何保证MyBatis中SqlSession的线程安全的?
  7. yii2实现WebService 使用 SoapDiscovery
  8. ajax请求完之前的loading加载
  9. 顺情说好话,耿直讨人嫌
  10. 02-2--数据库MySQL:DDL(Data Definition Language:数据库定义语言)操作数据库中的表(二)...
  11. 蒋文华《博弈论》笔记及视频摘录
  12. 人居一世间, 忽若风吹尘 2019.07.07.
  13. 健身中有氧运动和无氧运动是什么?它们有什么区别?
  14. HEVC函数入门(22)——变换量化
  15. 服务器2012分辨率不能修改,《F1 2012》无法修改分辨率解决方法
  16. 如何用OpenCV改变图片的大小?
  17. 如果你在用vivo手机拍照的话,这个功能要打开,不然白浪费了这么好的手机
  18. Go学习笔记_环境搭建
  19. linux下python升级版本
  20. org.eclipse.core.runtime.IPath报错

热门文章

  1. 人工智能会被黑客攻击?
  2. uiautomator2 启动atx
  3. 【一篇入魂】redis快速入门—部署、数据类型、持久化、事务、集群
  4. android 微信 备份通讯录,用微信导入手机通讯录?安卓手机的备份方法介绍
  5. 【NOIP2018模拟赛2018.10.22】pets
  6. 泰克电输运/物性表征/量子材料/超导材料测试方案
  7. 分享几款实用的识别图片文字的软件
  8. apache hop 搭建_server端
  9. 微创新:5种微笑改变创造伟大产品
  10. Oracle11g安装教程、配置实例、监听、客户端程序详解_Windows篇