文章目录

  • 原著
  • 概述
  • 创建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地址:

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

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

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

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

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

2. 网段地址

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

>>> 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就不是一个有效的网段,初始化时程序会抛出一个 ValueError异常. 可以设置参数strict=False来自动的把主机地址置0:

>>> 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')

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

>>> ipaddress.ip_network(3221225984)
IPv4Network('192.0.2.0/32')
>>> ipaddress.ip_network(42540766411282592856903984951653826560)
IPv6Network('2001:db8::/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.1ipaddress模块提供了类接口ip_interface来定义一个主机cidr地址

>>> 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')

Address/Network/Interface成员函数

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

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

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

从ip地址获取网络地址:

>>> 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

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

>>> 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

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

>>> 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')

ipv6简写/全写:

>>> 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地址,依然提供这两个方法,只是不做处理,原值返回,这样代码可以不区分的调用而不会产生异常

网段作为一个列表

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

>>> net4 = ipaddress.ip_network('192.0.2.0/24')
>>> 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')

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

# 参考代码
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

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

转换成字符串/整数

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

获取更多错误信息

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

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

>>> 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)

python ipaddress模块简介相关推荐

  1. python ipaddress模块使用

    1.ipaddress模块作用--创建.检查和操作IP地址 2.创建地址对象--ipaddress.ip_address()函数 函数作用--根据传入值(整数(十进制/十六进制/八进制/二进制)或字符 ...

  2. python paramiko 模块简介(SSH2协议)

    一:简介 paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接. 由于使用的是python这样的能够跨平台运行的语言,所以所有python支 ...

  3. Python:常用模块简介(1)

    sys模块 >>> sys.platform #返回操作系统平台名称 'win32' >>> sys.stdin #输入相关 <open file '< ...

  4. Python 常用模块简介

    模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才 ...

  5. Python pickle 模块简介

    pickle 模块实现用于序列化和反序列化 Python 对象结构的二进制协议."pickling"是将 Python 对象层次结构转换为字节流的过程,"unpickli ...

  6. python ipaddress模块_Python学习笔记-IP地址处理模块Ipy

    IP地址处理模块Ipy IPy模块可以很好的辅助我们高效完成IP的规划工作. 安装IPy模块[root@kurol ~]# python36 -m easy_install -i http://pyp ...

  7. Python sys模块 - Python零基础入门教程

    目录 一.Python sys 模块简介 二.Python sys 模块使用 三.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 在 ...

  8. Python PrettyTable 模块

    Python PrettyTable 模块 Python PrettyTable 模块 简介 安装 示例 使用 创建表 直接创建 从已有文件创建 CSV HTML SQL 添加元素 按行添加 按列添加 ...

  9. Python PrettyTable 模块(美化库)

    Python PrettyTable 模块 简介 安装 示例 使用 创建表 直接创建 从已有文件创建 CSV HTML SQL 添加元素 按行添加 按列添加 输出格式 ASCII码表 直接输出 无表格 ...

最新文章

  1. spark内存溢出怎么解决_和平精英:更新需要预留6G内存,玩家抱怨手机扛不住,怎么解决?...
  2. JMS Helloworld
  3. 在SQL Server 2005中实现异步触发器架构
  4. 【Verilog】一文了解verilog基础语法
  5. 6s的充电电流怎么测试软件,用数字万用表测量手机充电器的充电电流的方法和问题...
  6. edoc2文档管理系统
  7. 【Vue插件】一款很好用的vue日历插件——vue-sweet-calendar
  8. html适合做标题得字体,40个漂亮英文字体-而且适合制作大标题哦
  9. Windows环境下32位汇编语言程序设计(典藏版) 高清完整
  10. windows使用scrapy爬取微信评论
  11. PCB工程师级别评定标准
  12. pascal语法基础
  13. 为什么说DAO是未来的公司形式
  14. excel仪表盘制作,商业智能仪表盘的作用
  15. 豹子概率大还是顺金概率大?99%的人都搞错的问题
  16. 苹果6s要下岗了,预算5000给推荐一款手机呗?
  17. 白酒营销策划方案,如何通过社群一年做了超过8000万的营业额?
  18. MyTest.axf section `.text‘ will not fit in region `Flash30‘
  19. 解决 Hexo 配置 Valine 报错问题
  20. LTE学习-信道均衡(MMSE)

热门文章

  1. 安卓动态调试七种武器之长生剑 - Smali Instrumentation
  2. 加州伯克利本科学计算机好吗,加州大学伯克利分校计算机科学专业详解!
  3. c语言remove和rename不起作用,C语言探索之旅 | 第二部分第七课:文件读写
  4. 服务器w8系统如何重装系统,如何重装Windows8.1 Win8.1系统重装流程图解
  5. xp访问不了win10计算机,如何解决winxp访问win10共享打印机提示凭据不足
  6. JavaScript pink老师学习内容详解
  7. 母婴商城网站的可行性分析报告
  8. Gibonacci number【斐波拉契】
  9. 天下谁人不识君的上一句是什么,天下谁人不识君的意思?全诗赏析
  10. 1 制作一个表格html表格,学术论文表格制作速成!