![网络自动化运维教程](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=1739094711-vHL9M0F3uHzw5fOYoxXtkz2AchrJ3Qvh-0-5f0d60db39d7e44cc7b1731ec17f3240)
●导入模块中的某个或某些函数:from模块名import函数名。
![](https://epubservercos.yuewen.com/39F6BA/29808330704527306/epubprivate/OEBPS/Images/63711_20_02.jpg?sign=1739094711-8WzwHNrZe7UhMzPuarccahuTcKwUGzDC-0-8a49ada21bb594115758b86eef14849c)
●导入指定模块中的所有成员: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=1739094711-dR4Nap0YatcsRTCm2acpJQ1GWmjnlZZh-0-d53cf8bc83bc3f1601c29d47246ec0b8)
上面的代码可以独立运行,执行结果如下:
![](https://epubservercos.yuewen.com/39F6BA/29808330704527306/epubprivate/OEBPS/Images/63711_20_04.jpg?sign=1739094711-jeTybAzaCNji11qzTjrVjSY5ipIpi1lo-0-3f48dcffe26cee691d812e4929ba3950)
其次,将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=1739094711-z01gQ5Xxx6ntgrAvgkcFh8C3jOUV0gR3-0-abf141cbe49158b79b089ab933c73bb1)
![](https://epubservercos.yuewen.com/39F6BA/29808330704527306/epubprivate/OEBPS/Images/63711_21_01.jpg?sign=1739094711-K5cgwx1jPiw4qiLRCxZxGSUCqMkE51p6-0-64e92458dec388ebf79668be4a02ea2f)
执行结果如下:
![](https://epubservercos.yuewen.com/39F6BA/29808330704527306/epubprivate/OEBPS/Images/63711_21_02.jpg?sign=1739094711-TM5Gb6U3HdRkkHWBg2K7iodYMZDocOM4-0-d07880857af2f92ef78769ed3d3c2d65)
从上面的执行结果中可以看到,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=1739094711-ZZOTHa0C0Uyvawa8CtBHkQmIJ4TZQsSv-0-21c6dfcbad54ea77c3a9a8ae6e62fd00)
而get_correct_ip.py程序保持不变,在执行get_correct_ip.py后即可得到我们想要的结果:
![](https://epubservercos.yuewen.com/39F6BA/29808330704527306/epubprivate/OEBPS/Images/63711_21_04.jpg?sign=1739094711-Tp9qKYFl5NiKYuCBkmlfhgu4ikgmzV0w-0-59eec41871519b16ae3e4cc207be4445)
下面将介绍常用的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=1739094711-VVxA0uqXUnN2s43gxfN4thoNSko1lDUJ-0-d0942d5d45c21209f810f9ab2f60b0af)
也可以使用正整数来创建地址,默认小于232的整数是IPv4地址,大于232的整数则是IPv6地址。
![](https://epubservercos.yuewen.com/39F6BA/29808330704527306/epubprivate/OEBPS/Images/63711_22_01.jpg?sign=1739094711-KKOKHyI6OxWTjaNClrHD1JoLkWsF9zym-0-cee7aaa609e96e37e31321867982a5ba)
使用ipaddress.ip_address()创建IPv4Address对象有很多IPv4地址的属性。
![](https://epubservercos.yuewen.com/39F6BA/29808330704527306/epubprivate/OEBPS/Images/63711_22_02.jpg?sign=1739094711-h7Jbc9UFHgW27hacVOBROL35yA5bCtUU-0-3abfc31f78b6a3fa370ea66d62f7fabb)
●使用ipaddress.ip_network()函数创建IPv4/IPv6Address对象。
![](https://epubservercos.yuewen.com/39F6BA/29808330704527306/epubprivate/OEBPS/Images/63711_22_03.jpg?sign=1739094711-8cbIqOM5TNBL0GLHcyua9TkMVE5brCvs-0-8e7e3a825ad51b568831584e083c026f)
ipaddress.ip_network()函数允许划分网络(子网划分)。默认情况下,它将网络划分为两个子网。
![](https://epubservercos.yuewen.com/39F6BA/29808330704527306/epubprivate/OEBPS/Images/63711_22_04.jpg?sign=1739094711-mfk4Gn0QVE36Gra9masjxG5INuOJyUUq-0-271c60192af709d6aef9e2f1c4f90aa0)
通过prefixlen_diff参数设置允许指定子网的位数。
![](https://epubservercos.yuewen.com/39F6BA/29808330704527306/epubprivate/OEBPS/Images/63711_22_05.jpg?sign=1739094711-kwE9eAcgj7NZPe2YljV18aNAqMrvdMYr-0-7c35fe5ad594a4833f4013b436cd4d45)
●ipaddress.ip_interface()函数允许创建IPv4或IPv6接口对象。
![](https://epubservercos.yuewen.com/39F6BA/29808330704527306/epubprivate/OEBPS/Images/63711_22_06.jpg?sign=1739094711-oVbqNdNq5AdeM8EzV3mDTeazLFVyXMQq-0-bed8fafa80fc26753f1b033420ad8106)
(2)netaddr模块
该模块是Python处理IP地址和MAC地址的开源第三方库,是用于对网络地址段进行定义和操作的一个工具类。通过netaddr模块可以以非常灵活的方式定义网段,获取网段的一些常用信息,同时可以和网络地址与网段进行一些包含关系的运算。
netaddr模块不是Python的标准模块,使用前需要安装。
![](https://epubservercos.yuewen.com/39F6BA/29808330704527306/epubprivate/OEBPS/Images/63711_22_07.jpg?sign=1739094711-ohDwgVyD9IdMXSm2SySqAgXsqzhFc7fd-0-adf9ca9d6243c4eb27e487eaf4f24300)
●IPAddress对象表示单个IP地址,可以接收一个IPv4或IPv6地址字符串。
![](https://epubservercos.yuewen.com/39F6BA/29808330704527306/epubprivate/OEBPS/Images/63711_23_01.jpg?sign=1739094711-lwQ4Z4E6c2hDsD60M3KGtQaDnHXDhYJQ-0-f3ac1f57f7aa843c1b7b3b39e3372eb5)
●IPNetwork()是处理IP网段的方法,同样可以接收一个IPv4或IPv6地址字符串。
![](https://epubservercos.yuewen.com/39F6BA/29808330704527306/epubprivate/OEBPS/Images/63711_23_02.jpg?sign=1739094711-8NbwGrjZ965FTf7YxgmgDyLZrDinNCA8-0-b33e0a31621592c094e95b466dc3a247)
●cidr_merge()是网段的汇总方法,它只接收列表,列表中必须含有要汇总的网段。
![](https://epubservercos.yuewen.com/39F6BA/29808330704527306/epubprivate/OEBPS/Images/63711_23_03.jpg?sign=1739094711-XeP5y6uUFD2eI44La2oGTfCVFADADwZu-0-ad388c7d4b79a37c2e738e8eea0b3dc1)
●EUI()是netaddr格式化MAC地址的方法,可以接收任何表达形式的MAC地址字符串。
![](https://epubservercos.yuewen.com/39F6BA/29808330704527306/epubprivate/OEBPS/Images/63711_23_04.jpg?sign=1739094711-h6nLQcGLcTbB8jOeWXAqiBM0ZNMzYozA-0-2866ad9cfba031026cdedb2120d91b58)
(3)tabulate模块
通过tabulate模块可以精美地显示数据。它不是Python标准库,因此需要先进行安装。
![](https://epubservercos.yuewen.com/39F6BA/29808330704527306/epubprivate/OEBPS/Images/63711_23_05.jpg?sign=1739094711-8I6N45K4vVDGeeHfwbQ3R89H5rcPOgvn-0-a38faa37e90bf75f82ba417d79194811)
●tabulate模块支持列表、字典等表格数据类型。模块中的tabulate()函数用于制表。
![](https://epubservercos.yuewen.com/39F6BA/29808330704527306/epubprivate/OEBPS/Images/63711_24_01.jpg?sign=1739094711-fKmYi7TmX6nHSKxCHw0LJWZaPVuNzmeH-0-cf744be2f0d811c04eb4ccf5fcf1d03e)
●tabulate()函数还可以使用headers参数指定列名。
![](https://epubservercos.yuewen.com/39F6BA/29808330704527306/epubprivate/OEBPS/Images/63711_24_02.jpg?sign=1739094711-TChNP6WxQ0fp6k4uCoh47ij0GMJ3TGZg-0-085958c45e5255d8da7099f2f4334231)
●tabulate()函数还可以使用参数tablefmt输出网格。
![](https://epubservercos.yuewen.com/39F6BA/29808330704527306/epubprivate/OEBPS/Images/63711_24_03.jpg?sign=1739094711-ljfzFRT0RkbJgolcdCYTAxOOXZDfxiBR-0-71ff9f8292968e97b3cae5c2d4f96fbe)