一、模块
- 定义:模块是一个包含定义了函数和变量的文件,后缀名为
.py
(其实就是Java
中的类); - 模块可以被别的程序引入,以使用该模块中的函数功能。
- 模块中的函数、变量被使用的方式
- 被自己模块中的其他函数调用
- 被其他模块调用
1. 模块的引入方式一
import test_05_包安装与包管理
test_05_包安装与包管理.test()
结果:
测试
测试
注意:python
中,在import
该模块时,就会执行所有已经被调用的函数。
模块名为test_05_包安装与包管理
,所以上述打印结果是两个测试
,因为在import
的时候,已经把test_05_包安装与包管理
中的函数调用了一遍,在test_05_包安装与包管理.test()
执行后,又调用了test()
函数。
def test():
print("测试")
test()
-
如何解决上述情况
-
每个模块中都有一个特殊的变量
**__name__**
,当在自己模块中调用,结果是__main__
,在其他模块调用的时候,就是该模块名def test(): print("测试") print(__name__) if __name__ == '__main__': test()
运行自己模块:
结果:
__main__ 测试
在其他模块调用该模块
import test_05_包安装与包管理 test_05_包安装与包管理.test()
结果:
test_05_包安装与包管理 测试
第一行为模块名称,第二行为
test_05_包安装与包管理.test()
执行后的结果,可以看到只打印了一次测试
,就是因为import test_05_包安装与包管理
的时候if __name__ == '__main__':
条件不满足,所以没有执行下面的test()
函数。 -
2. 模块的引入方式二
from test_05_包安装与包管理 import test, num
test()
print(num)
通过
from
,import
两个关键字导入指定模块的多个函数变量,然后可以直接引用该函数、变量如果一个模块只想暴露指定函数、变量给其他模块调用,可以使用
__all__ = ["num"]
来控制,只有在这里申明的函数,变量才可被其他模块调用。
二、包
定义:按目录的方式来组织模块,其实就
Java
中的包是同一个概念-
和
Java
中包
不同的地方- 必须在包里面申明一个
__init__.py
模块,当然在建包的时候,这个模块会自动创建
- 必须在包里面申明一个
-
包中的模块的使用
-
在包外使用模块中的函数,变量
#导入test包下test1模块下test1函数 from test.test1 import test1 # 使用该函数 test1()
-
在包内使用模块里面的函数、变量
# 导入test包下面的test1模块 from test import test1 # 导入test包里面test1模块中的test1函数 from test.test1 import test1
总结:可以看到在包内外调用其他模块中的函数、变量,做法都是一样的。
-
三、包的安装和制作
1. 包的安装
2. 包的制作
-
第一步:在包的同级目录下新建一个模块名为
setup.py
的模块,专门用来配置要生成的包的信息。from distutils.core import setup setup( # 包的名称 name="test_demo", # 版本号 version="1.0", # 版本描述 description="", # 作者 author="", # 要打包的模块名,格式:包名.模块名 py_modules=["test.test1", "test.test2"] )
-
第二步:在
setup.py
所在目录下打开命令行窗口python setup.py build
可以看到这条命令的作用就是
创建
build\lib\test
文件夹,而且这里是一次创建一级文件夹
- 说明:这里的test
就是包名,如果建包的时候,包名命名为test1
,那么这里的目录就是build\lib\test1
将文件复制到上述文件夹下面
-
如果这条命令执行成功,就可以在磁盘里面看到对应的目录和文件。
setup.py
所在目录下执行以下命令python setup.py sdist
如果这条命令执行成功,包就已经打好了,可以在
/dist
目录下查看[图片上传失败...(image-ef5b28-1529201049112)]