Introduction本文介绍了Python中模块和包的概念。文章目录0×1。如何导入模块0×2。安装第三方模块0×3。如何导入包0×1。如何导入模块简单来说,模块就是一组可以扩展python函数的对象的集合,可以是类、方法,也可以是简单的数值对象,它们存储在一个或多个独立的文件中。python安装后自带大量模块文件。我们也可以自己创建模块,放到系统相应的目录下实现调用。以ubuntu系统为例,sys.path列表中的py文件都可以称为modules。不同系统对应的位置可能不同,但是可以通过如下命令查看:#查看python在idle中包含了哪些目录,这些目录下的模块文件可以被识别和调用,sys.path其实是一个内置的-在list中,我们可以使用append或者extend方法来添加我们需要包含的目录,这样python就可以调用我们设置的目录下的模块文件了。这个列表中的第一个元素(在本例中是一个空字符)表示当前目录,即模块文件和调用它的文件可以在同一个目录中被调用。,当py程序在不同的目录下启动时,这个元素会被py程序所在目录的路径替换>>>importsys>>>print(sys.path)['','/home/qing','/usr/bin','/usr/lib/python3.4','/usr/lib/python3.4/plat-x86_64-linux-gnu','/usr/lib/python3.4/lib-dynload','/usr/local/lib/python3.4/dist-packages','/usr/lib/python3/dist-packages']#手动添加目录,操作方法同列表,这里不再详细介绍>>>sys.path.append("/home/qing/test")>>>print(sys.path)['','/home/qing','/usr/bin','/usr/lib/python3.4','/usr/lib/python3.4/plat-x86_64-linux-gnu','/usr/lib/python3.4/lib-dynload','/usr/local/lib/python3.4/dist-packages','/usr/lib/python3/dist-packages','/home/qing/test']你可能注意到上面的例子中使用了一个import关键字,可以用来调用模块和包,而sys是python自带的模块之一(因为python内置的模块使用c语言,所以系统中没有sys.py文件),这个文件包含一个路径列表对象;我们创建的模块可以是一个.py后缀的python脚本文件,导入模块时不需要加py后缀,如果熟悉HTML中导入css文件的概念,import的作用类似使用HTMLhead标签中的link标签将css文件导入HTML文档,请看下面的例子:#根据上面的解释,现在我们在同一个目录下创建两个py文件,一个是模块文件,另一个用来调用这个模块#模块文件m1.py包含两个空类,只完成简单的初始化#!/usr/bin/envpython3#coding=utf-8######classOne:#------def__init__(self,items=[]):"""初始化列表"""self.items=items######class二:#------def__init__(self,items={}):"""初始化字典"""self.dect=items#调用文件test1.py和m1.py同目录#!/usr/bin/envpython3#coding=utf-8#通过m1.py的文件名,可以直接调用这个模块文件importm1#lst是m1模块中One类的实例对象,dect是TheTwoclassinm1lst=m1.One()dect=m1.Two()print(lst.items,dect.dect)#Programoutput[]{}除了上面的import方法,还可以同样使用from...import语句来实现导入,请看下面的例子:#修改test1.py文件如下#!/usr/bin/envpython3#这句话的意思是导入对象二(即,TheTwoclass)fromthem1modulefilem1importTwo#这个import方法在实例化的时候不需要写模块名,可以直接使用对象名,但是我们不能访问m1模块中除了两个类,比如onedect=Two()#另外还有一个比较有意思的import方法,修改test1.py文件如下#!/usr/bin/envpython3#"asterisk"告诉python解决方法解释器,导入m1模块中的所有对象,在本例中,相当于将One和Two这两个类导入到当前作用域中,fromm1import*#注意直接导入模块名,使用from导入one或者多个模块对象时,实例化对象语法的区别是前者需要使用模块名,而后者不需要x=One()y=Two()在实际环境中,语法“fromm1import*”是两者都是用模块的“__all__”列表导入的,请看下面的例子:#在m1.py文件的头部添加一个“__all__”列表#!/usr/bin/环境python3__all__=["一个"]#test1。py文件修改如下#!/usr/bin/envpython3fromm1import*#现在,在test1.py文件中,只有那些包含在m1.py文件头的“__all__”列表中的对象才能被实例化。如果此时初始化一个Two()对象就会报错。使用该方法,可以将模块中的可见对象开放给用户使用,一些内部对象不会被包含在“__all__”列表中。x=One()说到模块就不得不说了,我们来看一下python中的一个特殊变量“__name__”。有时我们写一个模块。当我们直接测试运行模块时,模块内部的一些方法是不会执行的。这时候,我们可以使用变量“__name__”来主动调用模块中的一些方法,请看下面的例子:模块的描述文件,__author__变量后面是模块的作者名,这些都是修饰语,不需要写#!/usr/bin/envpython#coding=utf-8"helloworld.pymodule"#Moduledescription__author__="www.qingsword.com"#Moduleauthor#打印出当前__name__变量的值print("__name__is",__name__)deftest_m():print("HelloWorld")#如果值为the__name__variableis__main__callthetest_m()methodif__name__=="__main__":test_m()#直接执行这个模块会打印出如下内容__name__is__main__HelloWorld#但是如果我们现在使用另外一个文件导入这个模块后importhelloworld#执行import语句后,我们只得到下面这句话__name__ishelloworld#由此我们得到两个重要的结论:#如果模块被导入,__name__的值就是模块名#如果直接执行模块,__name__的值为“__main__”#这样设计的好处是显而易见的。当我们测试模块时,我们直接运行模块代码。__name__的值为“__main__”,可以通过if语句调用。我们需要被调用的函数,如果其他文件调用这个模块,那么__name__的值为模块名,如果判断失败,则不会直接调用模块中的任何方法,如果需要调用,就使用方法名,在导入模块的文件中打印出__name__变量,程序流程一目了然#!/usr/bin/envpython#coding=utf-8importhelloworldhelloworld.test_m()print("__name__is",__name__)#程序输出,第一个__name__输出模块的名称(这是import导入helloworld模块时模块中print的输出),第二个__name__输出当前文件的名称,所有py文件都是直接运行__name__变量值为“__main__”__name__是helloworldHelloWorld__name__是__main__0×2。安装第三方模块除了创建自己的模块外,python还提供了大量的第三方模块。这些模块各有功能,对程序开发很有用。它节省了很多时间。在ubuntu中安装第三方模块的方法很简单。我只需要知道模块名称,我可以使用pip或pip3轻松安装它们。我们以Pillow图形库为例,打开终端,输入如下命令安装Pillow图形库:#如果你使用的是python3,对应的第三方模块安装命令为pip3,如果是python2,则是pipwww@qingsword.com:~$sudopip3installPillow需要什么模块,可以先到python第三方模块官网“pypi.python.org”查找模块名,使用上面的方法安装0×3。如何导入包一个模块只是一个文件,一个“包”可以是多个模块文件的集合。python中的“包”是以文件夹的形式存在的。Python将文件夹区分为“包”还是普通文件夹,主要查找文件夹中是否有“__init__.py”文件,如果有则判断此文件夹为“包”。请看下面的例子:#创建一个pack1文件夹,并在其中创建一个文件“__init__.py”文件,并在其中创建两个模块文件m1.py、m2.py,把这个文件夹和需要调用它的文件放在里面同目录#m1.py文件内容,新建两个空类如下#!/usr/bin/envpython3######classm1_class1:#------def__init__(self,items=[]):self.lst=items######classm1_class2:#------def__init__(self,items={}):self.dect=items#m2.py文件内容#!/usr/bin/envpython3######classm2_class1:#------def__init__(self,items=[]):self.lst=items######classm2_class2:#------def__init__(self,items={}):self.dect=items#在python3规范中,现在可以使用py脚本来访问这个包,虽然“__init__.py”文件仍然是空,把包文件夹和要访问这个包的脚本文件放在同一个目录下,我们可以像导入模块一样导入包里的模块,创建一个文件test2.py,放在同一个目录下part1包,并输入以下内容#!/usr/bin/envpython#coding=utf-8#导入pack1包中的m1和m2模块importpack1.m1,pack1.m2#实例化这两个里面的类模块分别为p1=pack1.m1.m1_class1()p2=pack1.m2。m2_class2()print(p1.lst,p2.dect)#programoutput[]{}同款和blockimport一样,如果我们不想让package中的所有模块都被访问,那么我们可以使用package目录下的“__init__.py”文件,在这个文件中输入如下内容#Give"__init__.py"file添加如下内容__all__=["m1"]#修改test2.py文件的导入方式,使用from#!/usr/bin/envpython#coding=utf-8#这条语句会在pack1package__init__.py"文件的__all__列表,并且只加载列表中列出的模块,因此在这种情况下,除非使用import导入,否则test2.py文件将无法访问m2模块的内容,或者m2被添加到Frompack1import*#中__all__列表类似于模块的from。该方法导入的包文件不需要添加包的顶级目录名p1=m1.m1_class1()
