和函数及类的机制一样,模块其实就相当于文件夹,而类其实相当于文件、函数就相当表示某个章节的段落,而其中的文字就是变量,这些变量或者文件是可以在各个模块中重复的(重名不冲突)。

模块的好处还在于,能够更有效的对功能类或函数进行独立管理和独立扩展,减小类或函数间的耦合,就相当于文件夹或压缩包对文件进行管理一样。

今天,主要小记一下python的几种常见的模块,以及如何引入模块,各种引入方式之间的区别,最后说明一下模块加载机制和常用的加载函数。


我们一般用import关键字来告诉计算机中的python,该去自己内置sys中的变量path所记录的路径去检索文件了,当遇到import后面的模块名字标记的模块,那就将这个模块的地址给放入当前运行程序的命名空间里。

>>> import sys>>> sys.path['', 'C:甥敳獲AdministratorAppDataLocalProgramsPythonPython37Libidlelib', 'C:甥敳獲AdministratorAppDataLocalProgramsPythonPython37python37.zip', 'C:甥敳獲AdministratorAppDataLocalProgramsPythonPython37DLLs', 'C:甥敳獲AdministratorAppDataLocalProgramsPythonPython37lib', 'C:甥敳獲AdministratorAppDataLocalProgramsPythonPython37', 'C:甥敳獲AdministratorAppDataLocalProgramsPythonPython37libsite-packages']#其中第一个空字符串''代表当前目录
def sum(a,b): sum = a*b print(sum)sum(2,3)

并将文件存放在桌面


import python 同目录文件报错 python import 文件夹_bc


然后,由于python中的path路径的检索机制,我们需要将另一个文件也要存放在桌面(当然,如果不放桌面也可以,只要你了解机器或程序的工作机制原理,你想怎么处理都可以)

import sumdemosumdemo.sum(22,3)#如果直接用sum(22,3),而非sumdemo.sum(22,3)会怎么样?#会直接去找python内置的sum函数,从而出现报错


import python 同目录文件报错 python import 文件夹_python检索路径下文件夹_02


我们把引入模块sumimport也放在桌面,以便利用python系统内置的path检索路径特点,让sumimport找到sumdemo。

值得注意的是,python会自动给我们引入路径里面添加一个文件__pycache__,这个缓存文件。

我们将这个文件夹打开,看到里面是一个python编译文件,以cpython为文件后缀,并标记为python编译文件,而前面是被引入的模块名——sumdemo


import python 同目录文件报错 python import 文件夹_命名空间_03


  • import的工作机制特点

一般import写在引入文件的首行或第二行(如果有包的话,第一行一般用来放包引入的语句),但写在文件程序的中间部分,也不会有什么影响,只是为了程序更加容易理解和易读,约定俗成而已。

另外,一个被引入模块不论被写了多少次import,都只会被导入一次(或许是因为命名空间是以字典方式存储变量地址的缘故——变量名作为键,变量地址作为值,这或许也是一个圈层内的命名空间不许变量重名的缘故)

  • from.....import ....的机制

在实际中,我们应用最多的应该是这种形式,该形式优势在于针对引入一个模块中的某个部分的地址到当前程序运行的命名空间,而非将这个模块的地址到命名空间里。其劣势在于,对于被引入模块的某些私有变量或功能无法引入。

当然,我们可以采用 from module import * 这里的*代表引入模块中的所有功能,但对于模块中用_这个单下划线表示的变量或功能函数,是引入不进来的。

这种引入方式,因为失去了module这个地址作为文件夹来保护这些引入的变量和功能函数,那这些变量和功能就失去了“文件夹”的保护,容易和程序员自己编写程序所起的变量产生命名冲突。

而这样做的好处也是有的:我们可以不用module.name来进行变量和功能,而直接用name即可。因为,我们通过from ....import ......引入的方式,可以直接将name导入到当前程序运行的命名空间内,而不将module的名字导入到命名空间内。


import python 同目录文件报错 python import 文件夹_命名空间_04


  • dir()函数——能够将一个模块中所有定义过的变量和功能变量都罗列出来,返回的是一个变量的列表。

>>> dir("sys")['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']>>> dir("sumdemo")['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']>>> dir("sumimport")['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

其中的__name__和__file__分别为导入的模块名和导入的文件名


import python 同目录文件报错 python import 文件夹_命名空间_05


import python 同目录文件报错 python import 文件夹_python_06


另外,globals()和local()两个函数主要用来返回模块中命名空间里的全局变量和局部变量


import python 同目录文件报错 python import 文件夹_python_07


可能因为我定义的这个模块,没有太复杂的层级关系,导致局部量其实和全局变量是同一个层次。

  • reload()——可以让程序重新加载一次模块的引入,在php中也有相应的关键词,就是php中的require(或require_once),还有php中的include或include_once。

但是要注意放入这个函数里的不是字符串,而直接是这个模块的名称。

  • 包——最大的一个文件夹,然后压缩,或者说包是程序的命名空间,就如同我们将文件归拢到不同的文件夹后,还要打包,然后再发送给其他人使用一样。

在python中,包就是一个文件夹(你从python官网下载python的编程环境,安装后,你看一下是不是一个个功能的文件夹。)


import python 同目录文件报错 python import 文件夹_python检索路径下文件夹_08


这些包文件夹中还有文件夹,比如我们打开lib这个核心功能文件夹,发现里面还有很多我们变成要用到的功能模块,也被python按照文件归类的方式放入了一个个有序的文件夹中。


import python 同目录文件报错 python import 文件夹_命名空间_09


最后我们打开集合处理功能的文件夹collections,发现里面有如下的文件和文件夹——其中__init__.py是包的开始标识。


import python 同目录文件报错 python import 文件夹_bc_10


但这个文件夹里面包含了一个__init__.py的文件,python就会自动给包含这个文件的层级“打包”成一个包,也就是说,这个__init__.py文件就相当于一个标识。不过我们也可以在__init__.py文件中进行包结构的“登记”,比如将每次包里面添加的为实现另一个功能的模块在__all__这个变量中进行登记,是个好习惯。因为,其实我们每次使用import进行包中的模块导入时,其实在python的内部机制中,就是找到这个__init__.py中去找__all__这个变量而已,即通过all这个变量来告诉python,这个包里面有那些文件。


import python 同目录文件报错 python import 文件夹_命名空间_11


也就是说,如果我们使用from module import * ,其中对于python的处理机制是,遇到从包里导入模块,那么只会找到包里的__init__.py的__all__这个列表,然后只会将这个变量列表中的模块导入。


import python 同目录文件报错 python import 文件夹_python_12


  • __name__的属性

当程序运行模块本身时,那么提交给系统的命名空间中__name__为main,但如果这个模块是被引入到另一个模块中时,提交给系统的命名空间就不是那么直接。那我们根据这个属性,就可以设置当这个模块被调用,哪些内容可以被执行,而哪些内容不能够被执行。


import python 同目录文件报错 python import 文件夹_python检索路径下文件夹_13