一.包的概念以及相关
1.包的概念
包就是文件夹,他用于存放文件也就是模块。包中也可以存放包
包就是一个包含了__init__.py文件的文件夹。
包只是模块的一种形式而已,包即模块。
2.包的作用:
在我们的项目中,可能会有太多的模块
但是我们不能把所有的模块这样放在这里,这样项目会乱七八糟。
我们可以将所有相同类型的模块放在一个文件夹中,这个文件夹就叫做包
二.包的结构
包的基本结构:
三.包的导入
1.包的导入注意事项
1.关于包相关的导入语句也分为import和from ... import ...两种,但是无论哪种,无论在什么位置,在导入时都必须遵循一个原则:凡是在导入时带点的,点的左边都必须是一个包,否则非法。可以带有一连串的点,如demo01.demo02.demo03,但都必须遵循这个原则。
2.对于导入后,在使用时就没有这种限制了,点的左边可以是包,模块,函数,类(它们都可以用点的方式调用自己的属性)。
3.对比import demo和from demo import name的应用场景:
如果我们想直接使用name那必须使用后者。
我们先创造一个包和包中的模块,方便下面操作。
在demon01之外,我们在创造一个py文件,用来测试这些包
2.import导入
我们在导入包时,尽量写入完整的路径
显示出来了,如果我们用import,就必须把import后面的所有路径都写完整。
3.from...import....导入
从......导入.......
这种导入有很多形式。
1.from 包名.模块名... import 变量名
使用方式: 例如 变量名() 或者print(变量名)
2.from 包名.模块名... import 变量名1,变量名2,...
使用方式: 例如 变量名1() 或者print(变量名2)
3.from 包名 import 模块名
使用方式:模块名.变量名() 或者 print(模块名.变量名)
4.from 包名 import 模块名,模块名1...
使用方式:模块名.变量名() 或者 print(模块名1.变量名)
5.关于__init__.py文件
我们在创建demon1的时候就自带了。它的作用是,只要我们引用demon1中的任意模块,它都会优先运行
(我们可以在每个包的文件内都打印一行内容来验证一下),这个文件可以为空,但是也可以存放一些初始化包的代码。
_
我们来往这里面添加点内容,让我们在调用demon01_01的时候,自动调用demon01_02
我们在__init__.py中添加
然后运行之前我们运行的包.
得到结果:
四.关于包的相对导入和绝对导入
我们的最顶级包base是写给别人用的,然后在base包内部也会有彼此之间互相导入的需求,这时候就有绝对导入和相对导入两种方式:
绝对导入:以base作为起始
相对导入:用.或者..的方式最为起始(只能在一个包中使用,不能用于不同目录内)
(1)绝对导入
测试:
(2)相对导入
测试:
相对路径运行注意事项:
在没有明确指定包结构的情况下,Python 是根据 __name__ 来决定一个模块在包中的结构的,如果是 __main__ 则它本身是顶层模块,没有包结构,如果是base.demo01.demo02 结构,那么顶层模块是 base。
如果是相对导入,一个模块必须有包结构且只能导入它的顶层模块内部的模块
如果一个模块被直接运行,则它自己为顶层模块,不存在层次结构,所以找不到其他的相对路径。
五.导入自定义模块
特别需要注意的是:可以用import导入内置或者第三方模块(已经在sys.path中),但是要绝对避免使用import来导入自定义包的子模块(没有在sys.path中),应该使用from... import ...的绝对或者相对导入。
1.直接运行demo03_test02模块
不会报错因为sys.path中已经添加了day05-包/demo03路径。Import会从sys.path中依次搜索路径。
2.在其他地方导入demo03_test02.py进行使用
因为此时的sys.path中只有demo01-包.py的路径 .../day05-包,import demo03_test01 只能从/day05-包下查找 demo03_test01模块。找不到因此报错。
解决import 导入包时的报错问题
我们可以在sys.path中添加import搜索的路径。
六.包的安装和发布
1.在包的同级目录创建 setup.py
from distutils.core import setup
setup(name='xt_zsh',
version='1.1,3',
description='描述:这是我的第一个包',
author='zsh',
author_email='123@163.com',
py_modules=['test1', 'test2'],
)
2.在命令行 运行 python setup.py build (可以不执行 )
构建模块
3.生成发布的压缩包 运行 python setup.py sdist
4.生成发布的压缩包 运行 python setup.py sdist