一、模块
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环境下测试。