Python3之模块、包

发布时间:2019-07-23 09:40:11编辑:auto阅读(1336)

    一、模块

    1.模块的导入方式

    import random,time
    #导入多个模块
    #使用,如:random.randint(1,10)
    #使用,如:time.sleep(1)
    
    from random import randint
    #使用,如:randint(1,10)
    
    from random import *
    #导入所有功能
    #使用,如:uniform(1,2)
    #但不建议这样用,
    # 因为当导入多个模块时,可能有同名的方法,这时只会调用最后导入的模块中的方法
    
    import random as rd
    #当某些模块名较长时,可以将模块重命名

    注意:
    1.当导入模块时,最先在当前路径下查找,没找到才会到系统中查找,所以py文件不要与模块名重名
    2.当导入模块时,实际上是先把模块程序执行一遍,所以当想将自己的py文件作为自定义模块时,测试部分的代码前应加上如下语句:

    #此处为实现某些功能的程序
    
    if __name__ == '__main__':
        #此处调用功能进行应用
        '''
        当本程序调用上面的功能时,__name__会返回字符串'__main__';当被别的程序导入调用时,会返回“模块的名字”
        '''

    2.模块中的__all__
    当使用from xx import *时,为防止导入其他不必要的东西,可以在自定义的模块中加上
    __all__ = [‘函数名’,’全局变量名’,’类名等等’](注意名称必须用字符串形式放在列表中)
    这时,from x import *时,只会导入列表中指定的功能

    举个栗子:

    '''
    #yyy.py中的代码
    
    __all__ = ["fun1"]
    
    def fun1():
        print("---fun1---")
    def fun2():
        print("---fun2---")
    '''
    from yyy import *
    import yyy as test
    fun1()
    try:
        fun2()
    except Exception as exc:
        print("调用fun2()异常:",exc)
    print("*********"*6)
    test.fun2()

    运行结果:

    F:\python_projects\venv\Scripts\python.exe F:/python_projects/test.py
    ---fun1---
    调用fun2()异常: name 'fun2' is not defined
    ******************************************************
    ---fun2---
    
    进程已结束,退出代码0

    运行结果可见:由于__all__ = ["fun1"]中没有”fun2”,所以尽管导入了所有,但是也只能调用fun1函数。当然,可以通过import yyy方式
    调用。

    二、包

    包就是将多个模块放在文件夹中,这个文件夹就是包;当然,这个文件夹与日常文件夹有点不同
    不同之处在于,该文件夹下除其他文件外,还有一个__init__.py文件,如图所示。
    当有这个文件时,就可以在包和需要导入包的程序处于同一目录的情况下,调用包中的模块了。不过仅限于使用from test_all import test_all_1,test_all_2(不能用from test_all import *),使用时也需要像test_all_1.fun1()这样调用

    这里写图片描述
    包内文件

    __init__.py在导入(import)包时,会自动执行。
    所以,解决上述问题的方法为:在__init__.py中写如下代码:

    __all__ = ["test_all_1","test_all_2"]
    #该句的作用是:可以用from test_all import *导入列表中指定的所有模块
    #这时就可以用"test_all_1.fun1()"形式调用函数了,但是不能通过import test_all导入
    
    from . import test_all_1,test_all_2
    #加上该句,则可以通过import test_all导入,然后通过test_all.test_all_1.fun1()调用

    在完成上述步骤后,还有一个问题,就是“包和需要导入包的程序必须处于同一目录”才可以导入,接着往下

    三、模块的发布与安装

    下面是完整的包文件夹:

    这里写图片描述
    图左边为文件夹内容


    新建了一个mymodule文件夹:包含一个setup.py文件以及前面的test_all文件夹,setup.py中需写入,代码:

    from distutils.core import setup
    
    setup(name="XiaoDong",version="1.0",description="XiaoDong's module",author="XiaoDong",
          py_modules=['test_all.test_all_1','test_all.test_all_2'])
    '''
    name为一会儿生成的.tar.gz包的名字;
    version为版本号
    description为对库的介绍
    author为开发人员名字
    还有其他的参数,比如邮箱等,详情可以到官网https://docs.python.org/3/distutils/index.html查看
    '''

    然后,在windows命令行中,切换到mymodule文件夹中,执行python setup.py build,注意:我只装了python3,这样生成的库只能python3用;要生成python2的库,就用python2执行。
    接着,再执行python setup.py sdist,就完成了

    这里写图片描述

    这时发现,mymodule文件夹下生成了一些文件,如图:
    这里写图片描述
    这里写图片描述


    图中的“XiaoDong-1.0.tar.gz”就是python库了,可以随便发给别人安装使用

    将“XiaoDong-1.0.tar.gz”解压:

    这里写图片描述

    然后,在命令行切换目录到setup.py文件夹下,执行python setup.py install
    这里写图片描述

    此时就安装成功了,可以在任意py文件中调用了
    这里写图片描述

    更详细发布python模块请看官方文档(https://docs.python.org/3/distutils/index.html)


    文章主要是本人在学习python过程中的一些笔记,便于后期复习,所以某些地方不会很详细。由于个人水平的限制,若有错误的地方,还请指正。代码部分是在python3.7环境下测试。

关键字