1. 模块
- 模块-->工具包;模块内类与函数-->工具
- python中一个py文件可以是一个模块
-
引入方式:
- import 模块名1,模块2...
#模块名.函数名
import math
#print(sqrt(2)) #这样会报错
print(math.sqrt(2))#这样才能正确输出结果
- from 模块名 import name1[, name2[, ... nameN]]
from random import randint
print(random.randint(0,5)) #没有引入random,仅仅引入random下面的randint,故而no define
print(randint(1,9))
- import 模块名 as 别名 #引入模块并为它取个别名
import random as rm
print(rm.randint(1,10))
-
建议不要使用 from 模块名 import *
这样会发生{后面导入的方法的覆盖前面导入的方法}的问题。
-
模块搜索流程:
- 当前目录
- 如果不在当前目录,Python则搜索在shell变量PYTHONPATH下的每个目录。
- 如果都找不到,Python会察看默认路径。UNIX下,默认路径一般为/usr/local/lib/python/。模块搜索路径存储在system模块的sys.path变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录。
-
定义自己的模块并调用:
- 定义一个模块
- 测试这个模块 {一般就在自定义模块内书写测试逻辑,然后直接运行自己,进行测试}
- import,然后就可以调用
-
_name_: {是变量不是方法}
- __name__的值:如果是直接运行__name__所在的模块,__name__的值为"_main_", 否则如果是其他模块import了__name__所在的模块,直接运行的是其他模块,那么__name__的值就是当前运行的模块名
- 若在待测试脚本.py文件中写了一个测试逻辑, 最后一行调用test()前可以用__name__把控是否执行测试逻辑:
#test.py。独自为一个文件,也就是我们的自定义模块,同时内部写入了测试逻辑
def add(a,b):#自定义模块的函数
return a+b
if (__name__ == "__main__"):# 用来进行测试:直接运行test.py才执行
ret = add(12,22)
print('int test.py file,,,,12+22=%d'%ret)
- usetest.py {是另外一个模块,即另外一个文件},使用刚才的自定义模块test.py
#这是usetest.py文件的内容
import test
result = test.add(11,22)
print(result)
2. 包:
-
导入包
- 包就是一个目录
- 把多个py文件放到同一个文件夹下
- 使用 import 文件夹.模块 的方式导入。{python3可以导入包,python2不行}
- 使用 from 文件夹 import 模块 的方式导入。{python3可以导入包,python2不行}
- 在包的文件夹下创建__init__.py文件。
在python2中:有一个目录,并且目录下有一个__init__.py的文件,才叫包。虽然文件内容没有,但是python2可以用了。有__init__.py文件在python3中没有有错。以后我们都在包的目录下新建一个init文件。- 在__init__.py文件中写入
from . import 模块1
from . import 模块2
那么可以使用 import 文件夹 导入模块 {省略写 from ...}- 也可以使用 from 文件夹 import 模块 的方式导入 {格式写全了,一定不会错}
-
总结:
包将有联系的模块组织在一起,即放到同一个文件夹下,并且在这个文件夹创建一个名字为__init__.py文件,那么这个文件夹就称之为包。有效避免模块名称冲突问题,让应用组织结构更加清晰
-
_init_.py的作用:
- 控制包的导入行为
- 如果为空,当 import 文件夹 后,就不能直接使用模块,还要写 文件夹.模块名
- 我们在__inti__.py里面写的语句,在导入这个包时会自动执行。因为默认导入包后,解释器先去自动执行__init__.py
-
3. 模块的发布:
把自定义的包加入python的系统目录
1. 制作自定义的包
- 构建一个文件目录,目录结构如下:
├── setup.py
├── Package1
│ ├── aa.py
│ ├── bb.py
│ └── init.py
└── Package2
├── cc.py
├── dd.py
└── init.py- setup.py文件中写入:
from distutils.core import setup
setup(name="压缩包的名字", version="1.0", description="描述", author="作者", py_modules=['Package1.aa', 'Package1.bb', 'Package2.cc', 'Package2.dd'])
2. 发布过程:
- windows环境:
- 切换到setup.py所在的目录下
- 以管理员身份运行cmd
- 输入 python setup.py sdist
- 输入 python setup.py install
- 注意到之前的源包文件中新增了dist和lib文件夹,dist文件夹有个压缩包,这个包就可以拿出去给其他人安装了
- linux环境:
- 切换到setup.py所在的目录下
- 以管理员身份运行terminal
- python setup.py build #构建模块
- python setup.py sdist #生成压缩包
- python setup.py install #安装自定义的包
3. 至此,可以在自己的python中像使用系统自带的模块一样,使用自己自定义的包了。
4. 模块的其他操作:
1. 模块的搜索路径设置:
import sys
print(sys.path)
sys.path.append('待加入模块的路径') #方法一,加入到搜索路径的最后一项,最后搜素
sys.path.insert(0,'待加入模块的路径') #方法二,且是加入到搜索路径的第一项,优先搜素
#重新导入模块
from imp import *
reload('模块名')
2. 查看安装的模块:
help('modules')
help('sys')