模块分类
1.系统模块
例如 os sys time
2.第三方模块
例如 pygame
3.自定义模块
例如 sendmsg
简单理解,模块就相当于"文件名.py"
模块的导入
main.py
#第一种导入方式
import sendmsg
import recvmsg
sendmsg.test1()
sendmsg.test2()
recvmsg.test1()
#第二种导入方式
#from sendmsg import test1,test2
#from sendmsg import test2
#第三种导入方式
#from sendmsg import *
#from recvmsg import *
#第二种、第三种导入方式的调用
#test1() #第三种导入方式相同的方法,最后一个导入的会覆盖前一个
#test2()
sendmsg.py
def test1():
print("-----test1----")
def test2():
print("-----test2----")
if __name__ == "__main__":
test1()
test2()
recvmsg.py
def test1():
print("----recvmsg---test1-----")
模块导入会产生缓存recvmsg.cpython-35.pyc文件,这个是python解释后的文件,再次执行可直接取缓存,这个里面有解释后的字节码,因为是c语言解释的,所以是cpython,35表示python版本号为3.5
模块中__all__属性
test.py
__all__ = ["test1",num,"Test"]
def test1():
print("-----test1----")
def test2():
print("-----test2----")
num = 100
class Test(object):
pass
模块外程序导入模块,使用 from test import *时,只能调用all中的函数、全局变量、类,没有包含的不能调用
包
只有存在__init__.py文件的文件夹才称作包
将sendmsg.py、recvmsg.py文件放入Test文件夹下,在Test文件夹同级调用该Test包
包(文件夹)在python2中不能直接导入,需要添加__init__.py空文件才能导入,导入后不能直接使用,python3能导入,但不能直接用
sendmsg.py
def test2():
print("-----test2----")
recvmsg.py
def test1():
print("----recvmsg---test1-----")
python2调用包内容:在__init__.py文件中
__all__ = ["sendmsg"] #此句只影响from Test import *的导入方式
import sendmsg #此句只影响import Test的导入方式
1.写上import sendmsg,在导入包后,可以通过Test.sendmsg.test2()来调用函数
2.写上__all__ = ["sendmsg"],可以通过调用sendmsg.test2()来调用函数
python3不支持import sendmsg的方式,但可以修改__init__.py内容import sendmsg
为from . import sendmsg
,python3就可以导入
自定义包
包的导入顺序:
1.当前路径下寻找
2.系统默认路径下寻找
第一步:
创建包,并在包的同级添加setup.py文件
第二步:
在setup.py文件中添加如下代码:
from distutils.core import setup
setup(name="dongGe", version="1.0", description="dongGe's module", author="dongGe", py_modules=['TestMsg.sendmsg', 'TestMsg.recvmsg']) #TestMsg是包,sendmsg是模块
第三步:
构建模块
python3 setup.py build
python3 setup.py sdist
最后一步:
安装到系统目录
sudo python3 setup.py install
给模块传参
test.py
import sys #模块中一定要导入sys模块
print(sys.argv) #使用sys.argv参数就可以得到给程序传的参数,类型为字符串列表
name = sys.argv[1] #argv[0]为第一个参数,内容为该文件的文件名,第二个参数为传参的第一个值
print("热烈欢迎 %s的到来"%name)
调用
python test.py 老王