python的包
一、介绍
包就是一个包含了__init__.py文件的文件夹。包只是模块的一种形式而已,包即模块。
二、包的导入
1.关于包相关的导入语句也分为import和from … import …两种。但是无论哪种,无论在什么位置,在导入时都必须遵循一个原则:
凡是在导入时带点的,点的左边都必须是一个包,否则非法。可以带有一连串的点,如demo01.demo02.demo03,但都必须遵循这个原则。
2.对于导入后,在使用时就没有这种限制了,点的左边可以是包,模块,函数,类(它们都可以用点的方式调用自己的属性)。
3.对比import demo和from demo import name的应用场景:如果我们想直接使用name那必须使用后者。
1.import导入
格式:import 包名.模块名
使用方法:包名.模块名.变量名
在package\model01中有一个test1.py模块
而这个模块中有一个lalala()函数,下面是调用这个模块和这个模块内函数的代码
import package.model01.test1
package.model01.test1.lalala()
2. from … import … 导入
格式如下:
- from 包名.模块名… import 变量名
使用方式: 例如 变量名() 或者print(变量名)
from package.model01.test1 import lalala
lalala()
-
from 包名.模块名… import 变量名1,变量名2,…
使用方式: 例如 变量名1() 或者print(变量名2) -
from 包名 import 模块名
使用方式:模块名.变量名() 或者 print(模块名.变量名)
from package.model01 import test1
test1.lalala()
- from 包名 import 模块名,模块名1…
使用方式:模块名.变量名() 或者 print(模块名1.变量名)
注意:from后import导入的模块,必须是明确的一个不能带点,否则会有语法错误,如:from a import b.c是错误语法
3. __init __.py文件
不管是哪种方式,只要是第一次导入包或者是包的任何其他部分,都会依次执行包下的__init__.py文件(我们可以在每个包的文件内都打印一行内容来验证一下),这个文件可以为空,但是也可以存放一些初始化包的代码。
4. from 包.模块 import *
此处是想从包one中导入所有,实际上该语句只会导入包下__init__.py文件中定义的名字,我们可以在这个文件中定义__all__:
from package.model01 import *
test1.lalala()
print(test1.name)
如果在model01这个包中的__init__.py文件中,添加__all__=[‘test1’],则上面的代码可以使用
__all__=['test1']
包的相对和绝对导入
绝对导入:以最*包作为起始
相对导入:用.或者…的方式最为起始(只能在一个包中使用,不能用于不同目录内)
1、绝对导入
2、相对导入
相对路径运行注意事项!!!
在没有明确指定包结构的情况下,Python 是根据 name 来决定一个模块在包中的结构的,如果是 main 则它本身是顶层模块,没有包结构。
如果是相对导入,一个模块必须有包结构且只能导入它的顶层模块内部的模块。如果一个模块被直接运行,则它自己为顶层模块,不存在层次结构,所以找不到其他的相对路径。
四、import 导入自定义包的子模块
特别需要注意的是:可以用import导入内置或者第三方模块(已经在sys.path中),但是要绝对避免使用import来导入自定义包的子模块(没有在sys.path中),应该使用from… import …的绝对或者相对导入。
不会报错因为sys.path中已经添加了model03包的路径。Import会从sys.path中依次搜索路径。
五、包的单独导入
单独导入包名称时不会导入包中所有包含的所有子模块。
from 包.包…import 模块或者import 包.包…模块
之前介绍的这几种导入方法,都是需要导入到模块这一层。
下面就介绍一下如果导入到包的那一层,要怎么导入里面的模块及使用
解决办法:需要从导入的包的__init__.py文件中进行操作
在这个__init__.py文件中写入:
from . import test1
from . import test2
由于之前已经导入了package包中的model05包,现在在model05包中的__init__文件中添加model05包的test1模块和test2模块
注意!!!运行的文件(package.py)和from引用的包要是平级,不能是package下面的package.py文件!具体是为什么,作者也还没弄清楚
包的安装和发布
1、在包的同级的目录创建setup.py
输入:
from distutils.core import setup
setup(
name='test',
version='1.0.0',
description='This is first package of me',
author='lee',
author_email='[email protected]',
py_modules=['test1.test01'],
)
2、在命令行运行python setup.py build
3、生成发布的压缩包,运行Python setup.py sdist
4、把生成的压缩包解压
5、安装包
安的卸载
直接找到对应的位置删除即可