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

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

 

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

- 模块是程序(代表导入模块时会执行模块的内容,相当于执行了一段程序)

- 模块用于定义(代表可以在模块中定义变量和函数,可以加强代码重用)

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

 

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

python处理模块有一定的机制,模块的搜索路径存储在sys.path中,通过打印该变量,我们可以看到一些内容,例如我的是:



>>> 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目录下。因此为了让你的模块可用,可以尝试把你的模块放在这些目录下面。

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

导入自定义模块的一般方法

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

我的本地文件结构:

python导入祖父类的模块 在python中导入模块_搜索

- 导入同级目录下的模块

  例如,从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

未完待续。。。