python导入模块总结与分析
定义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,所有的模块都在这里。如何在这种情况下导入模块。下面分几种情况进行分析。
我的本地文件结构:
- 导入同级目录下的模块
例如,从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
未完待续。。。