![网络自动化运维教程](https://wfqqreader-1252317822.image.myqcloud.com/cover/253/50603253/b_50603253.jpg)
1.3.3 网络模块
Python提供了强大的模块支持,不仅有大量的标准模块,还有大量的第三方模块。开发者也可以开发自定义模块。这些强大的模块可以极大地提高开发者的开发效率。
模块就是Python程序,任何Python程序都可以作为模块。随着程序功能的复杂化,程序不断变大。为了便于维护,通常会将其分为多个文件(模块),这样不仅可以提高代码的可维护性,还可以提高代码的可重用性。当编写好一个模块后,若编程过程中需要用到该模块的某个功能(由变量、函数、类实现),则无须做重复性的编写工作,直接在程序中导入该模块即可。
(1)导入模块
Python中有几种方法可以导入模块。
●导入整个模块:import模块名,如导入sys模块,import sys。
●导入整个模块,并指定别名:import模块名as别名。
![](https://epubservercos.yuewen.com/39F6BA/29808330704527306/epubprivate/OEBPS/Images/63711_20_01.jpg?sign=1739089460-QvGRFGi4kMDYzL9O901pr6uNPPQZ2KQl-0-6cea614d10314339a3275080780f74ba)
●导入模块中的某个或某些函数:from模块名import函数名。
![](https://epubservercos.yuewen.com/39F6BA/29808330704527306/epubprivate/OEBPS/Images/63711_20_02.jpg?sign=1739089460-gGXyAo5fS3hDXVghBfGHMKx9WL8z3X6u-0-743c475b038aea621db8aa02ed32b5e7)
●导入指定模块中的所有成员:from模块名import*。
(2)自定义模块
下面是创建自己的模块并将函数从一个模块导入另一个模块的例子。
首先,创建名为check_ip_func.py的文件,其功能是根据参数检查IP地址的正确性,返回IPv4Address或IPv6Address对象;默认情况下,小于232的整数将被视为IPv4地址。如果地址不是有效的IPv4或IPv6地址,则会引发ValueError。代码如下:
![](https://epubservercos.yuewen.com/39F6BA/29808330704527306/epubprivate/OEBPS/Images/63711_20_03.jpg?sign=1739089460-xb1PsZ3PG9jfj4KrySZ0XvYcbAD5Gjhl-0-f110ddd6e2a4019be18da749300dfaec)
上面的代码可以独立运行,执行结果如下:
![](https://epubservercos.yuewen.com/39F6BA/29808330704527306/epubprivate/OEBPS/Images/63711_20_04.jpg?sign=1739089460-gAxdXUve3TjRTn1Jxpy7tQbEUo6k1rQT-0-4c083a2a0dbda06b080f51646435c20c)
其次,将check_ip_func.py文件作为模块,供其他Python程序调用。在check_ip_func.py文件同一目录下,创建名为get_correct_ip.py文件,该文件将调用check_ip_func.py模块中定义的check_ip()函数,以从地址列表中选择正确的IP地址。
![](https://epubservercos.yuewen.com/39F6BA/29808330704527306/epubprivate/OEBPS/Images/63711_20_05.jpg?sign=1739089460-Id4Rz2PNgVM6yoVg5PStvrd5seskzQTT-0-3772044dc4130205d9c49139970863ab)
![](https://epubservercos.yuewen.com/39F6BA/29808330704527306/epubprivate/OEBPS/Images/63711_21_01.jpg?sign=1739089460-Am6LoaTY2kqrUy6Qbp2Oypm0NowL8Z5C-0-23f1dc9a473770632468e60ac779395f)
执行结果如下:
![](https://epubservercos.yuewen.com/39F6BA/29808330704527306/epubprivate/OEBPS/Images/63711_21_02.jpg?sign=1739089460-NASHsAWBL19WkhqLlH3SK2FaZvPJbA5r-0-56352eea5a62ccc6e7ce0bb138aee3f8)
从上面的执行结果中可以看到,Python解释器将模块check_ip_func.py中的代码也一块儿执行了,执行结果中的前3行就是模块check_ip_func.py的执行结果,但这并不是我们想要的结果。
想要避免这种情况的关键在于,要让Python解释器知道,当前要运行的程序是模块本身,还是导入模块的其他程序。在模块check_ip_func.py中,仅仅定义函数,不需要其他的代码,修改后的代码如下:
![](https://epubservercos.yuewen.com/39F6BA/29808330704527306/epubprivate/OEBPS/Images/63711_21_03.jpg?sign=1739089460-NKGxu3mMjX2jIHvPIUa7fLfPCHmrrpve-0-f9b9ba2fd5169e3ce041636f3a1f0d3f)
而get_correct_ip.py程序保持不变,在执行get_correct_ip.py后即可得到我们想要的结果:
![](https://epubservercos.yuewen.com/39F6BA/29808330704527306/epubprivate/OEBPS/Images/63711_21_04.jpg?sign=1739089460-MTukiuYMGUSCY8ET1PxVHwI1U20OSiMX-0-78a4fbedfadffb94672bb52a5a440f8a)
下面将介绍常用的3个网络编程模块:ipaddress模块、netaddr模块和tabulate模块。
(1)ipaddress模块
该模块包括IPv4和IPv6地址的类,可以用来生成、验证、查找IP地址。从Python 3.3开始,ipaddress模块正式成为Python标准库中的模块之一,不需要安装,可直接使用。
ipaddress模块中有IPv4Address类和IPv6Address类,可分别用来处理IPv4和IPv6地址。由于IPv4Address和IPv6Address对象共享许多共同属性,下面的案例将只处理IPv4格式,可以以类似的方式处理IPv6格式。
●ipaddress.ip_address()函数会根据传入的字符串自动创建IPv4/IPv6 Address对象。
![](https://epubservercos.yuewen.com/39F6BA/29808330704527306/epubprivate/OEBPS/Images/63711_21_05.jpg?sign=1739089460-DNznJCNkEc6jPr43XjEdj24DheQJBKWu-0-21230d5977339bb28e671b3e13d8cc62)
也可以使用正整数来创建地址,默认小于232的整数是IPv4地址,大于232的整数则是IPv6地址。
![](https://epubservercos.yuewen.com/39F6BA/29808330704527306/epubprivate/OEBPS/Images/63711_22_01.jpg?sign=1739089460-zMSNTATgKlItYaP3Eb8qRFP0a1xVD2j1-0-5f538f4b220ad476b7fe88e1861546a9)
使用ipaddress.ip_address()创建IPv4Address对象有很多IPv4地址的属性。
![](https://epubservercos.yuewen.com/39F6BA/29808330704527306/epubprivate/OEBPS/Images/63711_22_02.jpg?sign=1739089460-K1PdiSuF61zMztmZD1rocGOOow6n4vLy-0-a038baf2dacfad317d84d5c0aef8583f)
●使用ipaddress.ip_network()函数创建IPv4/IPv6Address对象。
![](https://epubservercos.yuewen.com/39F6BA/29808330704527306/epubprivate/OEBPS/Images/63711_22_03.jpg?sign=1739089460-utlvCW8aRP2xoxqPt8gTGwlcGygYiE6C-0-86fcb80a5bb73254a7fccc94b692435d)
ipaddress.ip_network()函数允许划分网络(子网划分)。默认情况下,它将网络划分为两个子网。
![](https://epubservercos.yuewen.com/39F6BA/29808330704527306/epubprivate/OEBPS/Images/63711_22_04.jpg?sign=1739089460-0FOOqAQsFK7lVf66k1Hc8P2zyMh1Gvs0-0-c13a3f2c2e44dfe52fb69336dcdf4dd3)
通过prefixlen_diff参数设置允许指定子网的位数。
![](https://epubservercos.yuewen.com/39F6BA/29808330704527306/epubprivate/OEBPS/Images/63711_22_05.jpg?sign=1739089460-rJetQXSSkdgx1goiMfUQBPkkCUZ1z55K-0-56155fd9da669486a8b961932a5d85e7)
●ipaddress.ip_interface()函数允许创建IPv4或IPv6接口对象。
![](https://epubservercos.yuewen.com/39F6BA/29808330704527306/epubprivate/OEBPS/Images/63711_22_06.jpg?sign=1739089460-jSw0w6siFKp4pY7z6G5eAygTAyrZV9OV-0-eb49725feff015bf6469e65f73a9a058)
(2)netaddr模块
该模块是Python处理IP地址和MAC地址的开源第三方库,是用于对网络地址段进行定义和操作的一个工具类。通过netaddr模块可以以非常灵活的方式定义网段,获取网段的一些常用信息,同时可以和网络地址与网段进行一些包含关系的运算。
netaddr模块不是Python的标准模块,使用前需要安装。
![](https://epubservercos.yuewen.com/39F6BA/29808330704527306/epubprivate/OEBPS/Images/63711_22_07.jpg?sign=1739089460-Q3x0g5nCQVLGcoz3E6nUOPf5JffETQdL-0-24eec9949562d75475d2d417c40023de)
●IPAddress对象表示单个IP地址,可以接收一个IPv4或IPv6地址字符串。
![](https://epubservercos.yuewen.com/39F6BA/29808330704527306/epubprivate/OEBPS/Images/63711_23_01.jpg?sign=1739089460-XIzSyQ6Y2GvZIolywQSC7xgnSGQbqBaN-0-f1ad110399304fedbf3751f51ea40d20)
●IPNetwork()是处理IP网段的方法,同样可以接收一个IPv4或IPv6地址字符串。
![](https://epubservercos.yuewen.com/39F6BA/29808330704527306/epubprivate/OEBPS/Images/63711_23_02.jpg?sign=1739089460-NV93SvY1RkUTYHK6jNFUNOHKePGzZRXP-0-69638313520209d196a523abe36e984d)
●cidr_merge()是网段的汇总方法,它只接收列表,列表中必须含有要汇总的网段。
![](https://epubservercos.yuewen.com/39F6BA/29808330704527306/epubprivate/OEBPS/Images/63711_23_03.jpg?sign=1739089460-uvzGnewf90TcY2ZFS8tHwjgxu8IA32bA-0-33808ed6ab68f618f1ac737d294abc1d)
●EUI()是netaddr格式化MAC地址的方法,可以接收任何表达形式的MAC地址字符串。
![](https://epubservercos.yuewen.com/39F6BA/29808330704527306/epubprivate/OEBPS/Images/63711_23_04.jpg?sign=1739089460-zeWu6XAyJuhy62aGGEZHzMnEppLwshor-0-a93db706d434d1bf5d84a954a9471585)
(3)tabulate模块
通过tabulate模块可以精美地显示数据。它不是Python标准库,因此需要先进行安装。
![](https://epubservercos.yuewen.com/39F6BA/29808330704527306/epubprivate/OEBPS/Images/63711_23_05.jpg?sign=1739089460-6nxlhRo4NBBIlOKoR0M1BONyVM6d3J6N-0-9b338a79738f3beb1bbe23554964f232)
●tabulate模块支持列表、字典等表格数据类型。模块中的tabulate()函数用于制表。
![](https://epubservercos.yuewen.com/39F6BA/29808330704527306/epubprivate/OEBPS/Images/63711_24_01.jpg?sign=1739089460-mJc9TlVSY5mnHF0SlXu6CBi3C0kOmTDo-0-8a38714754226654b927f80f7668dbf8)
●tabulate()函数还可以使用headers参数指定列名。
![](https://epubservercos.yuewen.com/39F6BA/29808330704527306/epubprivate/OEBPS/Images/63711_24_02.jpg?sign=1739089460-BGC0Ly1h2nndZw6sxeDUo6Ndc17bDqOv-0-4519050e349e40d7ce7672d1b3521e80)
●tabulate()函数还可以使用参数tablefmt输出网格。
![](https://epubservercos.yuewen.com/39F6BA/29808330704527306/epubprivate/OEBPS/Images/63711_24_03.jpg?sign=1739089460-2JOkRv5jEjbdo1aEg9jYCgE7pDH1XDxa-0-a386400f2fc7e63b0ff8daed8c53cf4b)