Python3之模块、包

2023-01-31 01:01:06 模块 python3
一、模块

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环境下测试。

相关文章