python 第三方包tree python第三方包位置_自定义


前言

相信已经有很多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包的文件目录说明:


python 第三方包tree python第三方包位置_python 第三方包tree_02


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模块、包和库

希望本文能对您有所帮助! 喜欢的话就点个赞加关注支持一下哈:)