37-模块与包

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')

3. 避免模块的循环引用:减低模块间的耦合性

原文地址:https://www.cnblogs.com/LS1314/p/8504567.html