模块概述在Python中,一个.py文件就是一个模块(Module)。为了避免模块名称冲突,Python引入了一种按目录组织模块的方法,称为Package。mycompany├─web│├─__init__.py│├─utils.py│└─www.py├─__init__.py├─abc.py├─xyz.py└─utils.py引入包后,只要作为顶层的包名如果不和别人冲突,那么所有的模块都不会和别人冲突。现在,abc.py模块的名字变成了mycompany.abc,xyz.py的模块名字变成了mycompany.xyz;www.py模块的名称变为mycompany.web.www,两个文件utils.py的模块名称分别为mycompany.utils和mycompany.web.utils。每个包目录下都会有一个__init__.py文件。这个文件必须存在,否则,Python会把这个目录当作普通目录,而不是包。__init__.py可以是空文件,也可以包含Python代码。模块名称不能与系统模块名称冲突。最好检查系统中是否已经存在该模块。检查的方法是在Python交互环境下执行importabc。如果成功,说明该模块已经存在于系统中。写一个模块写一个hello.py模块:#!/usr/bin/envpython3#-*-coding:utf-8-*-'atestmodule'__author__='MichaelLiao'importsysdeftest():args=sys.argviflen(args)==1:print('Hello,world!')eliflen(args)==2:print('Hello,%s!'%args[1])else:print('Toomanyarguments!')if__name__=='__main__':test()第一行是标准的注释,让这个.py文件可以直接在Unix/Linux/Mac上运行;第二行是标准注释,表示一个.py文件使用标准的UTF-8编码;第4行是表示模块文档注释的字符串,任何模块代码的第一个字符串都视为模块的文档注释;第6行使用__author__特殊变量来记录作者姓名;第8行导入系统内置的sys模块。sys模块有一个argv变量,将命令行的所有参数存放在list中。argv至少有一个元素,第一个参数始终是.py文件的名称。运行python3hello.py得到的sys.argv为['hello.py'];运行python3hello.pyWu得到的sys.argv是['hello.py','Wu']。最后两行代码的意思是:当我们在命令行运行hello模块文件时,Python解释器设置了一个特殊的变量__name__为__main__,但是如果hello模块是在别处导入的,则不会设置,所以这个if测试允许模块在从命令行运行时执行一些额外的代码,最常见的是运行测试。测试运行我们可以使用命令行运行hello.py看看效果:$python3hello.pyHello,world!$pythonhello.py吴你好,吴!如果启动Python交互环境,则导入hello模块:$python3>>>importhello>>>导入时,Hello,word!没有被打印出来,因为test()函数没有被执行。这时候需要调用hello.test()打印出Hello,word!:>>>hello.test()Hello,world!
