python导入模块总结与分析

定义1:python中什么是模块? 答:模块就是一个.py文件,每个以py做为后缀的文件,都是一个模块。python

定义2:Python中什么是包? 答:包是一类特殊的模块,他能包含其余模块,为了更好的组织模块而出现,称为包。须要注意的是,但愿python认为这个模块是包的话,这个模块必须包含一个名为__init__.py的模块。假设包名为package,import package时,首先会执行—__init__.py中的内容app

 

《Python基础教程》对于第十章“自带电池”中对于模块介绍的标题为函数

- 模块是程序(表明导入模块时会执行模块的内容,至关于执行了一段程序)spa

- 模块用于定义(表明能够在模块中定义变量和函数,能够增强代码重用)code

- 让你的模块可用(后面详细讲解,会有扩展,主要内容)blog

 

sys.path - 寻找模块时的搜索路径教程

python处理模块有必定的机制,模块的搜索路径存储在sys.path中,经过打印该变量,咱们能够看到一些内容,例如个人是:ip

>>> import sys, pprint
>>> pprint.pprint(sys.path)
['',
 'D:\\anaconda\\python27.zip',
 'D:\\anaconda\\DLLs',
 'D:\\anaconda\\lib',
 'D:\\anaconda\\lib\\plat-win',
 'D:\\anaconda\\lib\\lib-tk',
 'D:\\anaconda',
 'D:\\anaconda\\lib\\site-packages',
 'D:\\anaconda\\lib\\site-packages\\Sphinx-1.5.1-py2.7.egg',
 'D:\\anaconda\\lib\\site-packages\\thrift-0.10.0-py2.7.egg',
 'D:\\anaconda\\lib\\site-packages\\win32',
 'D:\\anaconda\\lib\\site-packages\\win32\\lib',
 'D:\\anaconda\\lib\\site-packages\\Pythonwin',
 'D:\\anaconda\\lib\\site-packages\\setuptools-27.2.0-py2.7.egg']

每一个人的sys.path都不太相同,这取决于你的python安装方式,因为我是使用anaconda进行安装的,因此不少路径与anaconda相关。须要稍微强调的是开发

- lib和site-packages,通常的模块都在这里可以找到,使用pip进行安装的时候,大多数也是进入site-packages目录下。所以为了让你的模块可用,能够尝试把你的模块放在这些目录下面。it

- 模块的搜索过程是从sys.path中遍历搜索是否存在该模块,找到第一个就直接返回,所以同名模块有可能在搜索过程当中被覆盖。这也是为何当前路径老是在sys.path第一个位置的缘由。若是本地统计目录定义了一个模块,搜索时会第一个从本地搜索到。

导入自定义模块的通常方法

除了专门开发python模块的人,咱们在使用python时,不会把模块都写在sys.path中系统指定的那些位置,未免有些太麻烦了。咱们会有本身的working directory,全部的模块都在这里。如何在这种状况下导入模块。下面分几种状况进行分析。

个人本地文件结构:

- 导入同级目录下的模块

  例如,从parent_module.py 中导入parent_module2.py,只须要 import parent_module2.py

# content in parent_module.py file
name = 'parent_module'
print 'I am', name
import parent_module2

# content in parent_module2.py file
name = 'parent_module2'
print 'I am', name

  执行 python parent_module.py 获得:

PS E:\workspace_vs\import_test> python .\parent_module.py
I am parent_module
I am parent_module2

- 导入子级目录下的模块

  也很简单,例如从parent_module.py中导入pson_module.py,只须要 import parent_package.pson_module.py

# content in parent_module.py
name = 'parent_module'
print 'I am', name
import parent_package.pson_module

# content in parent_package.pson_module.py
name = 'pson_module'
print 'I am', name

  执行 python parent_module.py 获得:

PS E:\workspace_vs\import_test> python .\parent_module.py
I am parent_module
I am pson_module

- 导入父级目录下的模块

  这个就有点意思了,先说正确的方式,为了让系统搜索到父级的模块,首先须要找到父级目录的地址,一行代码sys.path.append('..')

  可是注意:上面append('..')方法将上级目录加入path中,可是这个上级是相对于谁呢?应该是python的working directory,因此想要保证正确执行须要直接python .\parent_module.py,而不能再其它路径执行该文件

  另外,执行一个python文件的时候,不管working directory是哪里,都会把该python文件(模块)所在的目录添加在sys.path中的第一项。

后面重点在于讲解relative import 和 absolute import

未完待续。。。