前言
相信已经有很多Python初学者都知晓Python具备强大的库(包/模块)支持,不过在具体使用时对库、包、模块还不是特别清晰。因此,我做了一些归纳总结,特此分享给需要的朋友们。
本文分享内容的目录如下:
0. 前言
1. 基本概念(函数、类、模块、包、库)
2. Python库示例说明(示例包文件目录结构及说明、示例模块内容展示及说明)
3. Python库的导入说明(五种)
4. Python库的使用说明
--4.1 Python内置函数使用
--4.2 Python标准库使用
--4.3 Python第三方库使用
5. 自定义Python库创建和使用
--5.1 尝试直接导入使用失败
--5.2 原因分析-问题出在模块搜索路径
--5.3 问题解决方法
--5.4 真正使用自定义Python库
6. 结束语
限于篇幅,在《Python学习点滴02 - 弄清模块、包和库(1)》中已经介绍了第0章-第3章内容,在《Python学习点滴02 - 弄清模块、包和库(2)》中已经介绍了第4章内容,本文接着介绍第5、6章内容。
本文开发环境为:
- Windows 7 64-bit
- Python 3.8.5 64-bit。
- IDLE (Python 3.8.5 64-bit)
1. 基本概念
详见《Python学习点滴02 - 弄清模块、包和库(1)》中的第1章内容。
2. Python库示例说明
详见《Python学习点滴02 - 弄清模块、包和库(1)》中的第2章内容。
3. Python库的导入说明
详见《Python学习点滴02 - 弄清模块、包和库(1)》中的第3章内容。
4. Python库的使用说明
详见《Python学习点滴02 - 弄清模块、包和库(2)》中的第3章内容。
5. 自定义Python库创建和使用
5.1 构思自定义Python库文件目录结构
首先我们需要提前构思好自定义Python库的文件目录结构。下面在C:下构建一个名为myshape包为例进行介绍。
需要特别注意的是:自定义的包名/模块名不应该与系统内置模块、已安装的第三方包名/模块名重名。
一、自定义Python库——myshape包(其路径如:C:myshape)的文件目录结构:
myshape ├─ __init__.py ├─ circle.py └─ rectangle.py
二、myshape包的文件目录说明:
5.2 创建自定义Python库
下面分别创建myshape包下的各模块文件(各模块文件仅为示例用途,会比较简单和并不完整):
一、__init__.py文件内容如下:
''' __init__.py: myshape module ''' # 变量__version__ __version__ = '0.1' if __name__ == '__main__': print('这是单独执行本文件')
注:上面if语句的作用是,只有当单独执行__init__.py文件时,才会执行print()函数:
– 当__init__.py作为独立程序执行时,__name__属性的值是`__main__`;
– 当__init__.py作为模块被导入时,__name__属性的值是该模块的名字myshpe;
二、circle.py文件内容如下:
''' circle.py: circle module ''' # 常量PI PI = 3.1415926 # 变量name name = '圆模块' # 类Circle class Circle(): # 构造方法 def __init__(self, radius): self.radius = radius # 实例方法:计算周长 def perimeter(self): return 2 * PI * self.radius # 实例方法:计算面积 def area(self): return PI * self.radius * self.radius
三、rectangle.py文件内容如下:
''' rectangle.py: rectangle module ''' # 变量name name = '矩形模块' # 类Rectangle class Rectangle(): # 构造方法 def __init__(self, length, width): self.length = length self.width = width # 实例方法:计算周长 def perimeter(self): return (self.length + self.width) * 2 # 实例方法:计算面积 def area(self): return self.length * self.width
5.3 使用自定义Python库
创建好了自定义Python库(myshape包,其路径为:c:myshape)后,接下来就是如何使用了。
5.3.1 尝试直接导入使用失败
我们打开一个新的IDLE (Python 3.8.5 64-bit),然后尝试:导入myspace包,访问并输出该包中的代码元素(__version__变量),看看情况会如何?
Python 3.8.5 (tags/v3.8.5:580fbb0, Jul 20 2020, 15:57:54) [MSC v.1924 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license()" for more information. >>> import myshape Traceback (most recent call last): File "", line 1, in import myshape ModuleNotFoundError: No module named 'myshape' >>>
在我们执行完import myshape命令后,发现IDLE竟然给出报错提示:没有发现myshape模块。
5.3.2 原因分析 - 问题出在模块搜索路径
上面报错的原因在于模块搜索路径没有发现myshape模块。
Python解释器在启动时会自动加载一些模块,可以使用sys.modules查看。
在默认情况下,在第一次导入某个模块(如myshape模块)时,Python解释器会依次如下处理:
Step1、首先检查myshape模块是否已经被加载到内存中,如果有则直接引用;
Step2、如果没有,则接着查找具有myshape名称的内置模块,如果找到则直接引用;
Step3、如果没有找到,则接着从sys.path给出的目录列表中依次查找myshape.py文件;
sys.path路径初始化的值来自:
– Step3-1:在输入脚本的当前目前
– Step3-2:在PYTHONPATH指定的目录
– Step3-3:在Python的安装目录(如我电脑上安装路径是:C:DevelopPython)
>>> import sys >>> sys.path['', 'C:DevelopPythonLibidlelib', 'C:DevelopPythonpython38.zip', 'C:DevelopPythonDLLs', 'C:DevelopPythonlib', 'C:DevelopPython', 'C:DevelopPythonlibsite-packages', 'C:DevelopPythonlibsite-packageswin32', 'C:DevelopPythonlibsite-packageswin32lib', 'C:DevelopPythonlibsite-packagesPythonwin'] >>>
注:上面sys.path的输出结果中,第一项''(左方括号与第一个逗号之间)即表示当前目录。
经过上述步骤后,都没有找到myshape模块,因为模块搜索路径中并包含模块所在的位置,所以就给出报上述错提示信息了。
5.3.3 问题解决方法
既然原因分析清楚了,那么问题也就容易解决了。可以有如下二种解决方法:
一、解决方法一:【推荐使用】
方法思路:直接把myshape包复制到当前sys.path路径中相应目录下,然后就完全可以正常使用了。
方法实现:
-- 可以直接把myshape文件夹复制到本机Python第三方库存放路径C:DevelopPythonLibsite-packages下,毕竟自定义库本身就是第三方库。
-- 另外也可以直接把myshape文件夹复制到本机Python标准库存放路径C:DevelopPythonLib下,但不推荐。
注意事项:本方法优点是简单、便捷、彻底;但是需要一个前提,就是你的自定义库已经足够完善稳定。
二、解决方法二:【不推荐使用】
方法思路:把myshape模块所在的位置(C:myshape)添加到模块搜索路径中。
方法实现:
>>> import sys # 在sys.path中添加myshape模块所在的位置(C:myshape) >>> sys.path.append("C:myshape") # 验证查看,在最后一项中看到了`C:myshape` >>> sys.path ['', 'C:DevelopPythonLibidlelib', 'C:DevelopPythonpython38.zip', 'C:DevelopPythonDLLs', 'C:DevelopPythonlib', 'C:DevelopPython', 'C:DevelopPythonlibsite-packages', 'C:DevelopPythonlibsite-packageswin32', 'C:DevelopPythonlibsite-packageswin32lib', 'C:DevelopPythonlibsite-packagesPythonwin', 'C:myshape'] >>> import myshape # 此时导入myshape就正常了 >>>
注意事项:本方法如果退出Python环境后,则下次导入myshape时仍然需要执行"把myshape模块所在的位置(C:myshape)添加到模块搜索路径中"的步骤,会很不方便。
5.3.4 真正使用自定义Python库
问题解决了,就可以真正开始使用自定义Python库了。
下面给出针对myshape包以及myshape.circle模块和myshape.rectangle模块中各代码元素的推荐使用示例:
# 导入自定义Python库myshape包中指定的代码元素(并指定别名) >>> from myshape import __version__ as ver # 导入自定义Python库myshape包下的circle模块中指定的代码元素(并指定别名) >>> from myshape.circle import PI, name as cname, Circle as Cir # 导入自定义Python库myshape包下的rectangle模块中指定的代码元素(并指定别名) >>> from myshape.rectangle import name as rname, Rectangle as Rect >>> # 使用代码元素(myshape模块中别名变量) >>> ver '0.1' >>> # 使用代码元素(myshape包下的circle模块中的常量) >>> PI 3.1415926 >>> # 使用代码元素(myshape包下的circle模块中的变量) >>> cname 'circle模块' >>> # 使用代码元素(myshape包下的circle模块中的类别名), # 创建一个Circle类的实例mycir,半径为2 >>> mycir = Cir(5) # 使用代码元素(myshape包下的circle模块中的类的perimeter()方法)计算圆周长 >>> mycir.perimeter() 31.415926 # 使用代码元素(myshape包下的circle模块中的类的area()方法)计算圆面积 >>> mycir.area() 78.539815 >>> # 使用代码元素(myshape包下的rectangle模块中的变量) >>> rname 'rectangle模块' >>> # 使用代码元素(myshape包下的rectangle模块中的类别名), # 创建一个Rectangle类的实例myrect,长5,宽4 >>> myrect = Rect(5, 4) # 使用代码元素(myshape包下的rectangle模块中的类的perimeter()方法)计算矩形周长 >>> myrect.perimeter() 18 # 使用代码元素(myshape包下的rectangle模块中的类的area()方法)计算矩形面积 >>> myrect.area() 20 >>>
结束语
希望本次分享的对Python的模块、包、库的基本概念、Python库示例说明、Python库的导入说明、Python库的使用说明和自定义Python库的创建和使用的详细细介绍,能让您真正弄清Python模块、包和库。
希望本文能对您有所帮助! 喜欢的话就点个赞加关注支持一下哈:)