• 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. 避免模块的循环引用:减低模块间的耦合性

  • 相关阅读:
    mmall商城用户模块开发总结
    Hadoop伪分布式安装与配置
    1.2假设空间
    1.1基本术语
    文献笔记
    文献下载
    文献管理
    文献检索
    python:函数详解2
    python:函数详解
  • 原文地址:https://www.cnblogs.com/LS1314/p/8504567.html
Copyright © 2020-2023  润新知