定义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

未完待续。。。

python导入模块总结与分析的更多相关文章

  1. Python导入模块的三种形式

    Python导入模块的3中方式: 1.import module_name 这样在程序里就可以通过module_name.metnod_name()的方式访问模块里的函数了 Example: > ...

  2. python 导入模块 import 理解

    --python 导入模块 import 理解 -----------------------------------2014/03/18 python 导入一个模块的过程要求有一个叫做“路径搜索”的 ...

  3. python导入模块时的执行顺序

    当python导入模块,执行import语句时,到底进行了什么操作?按照python的文档,她执行了如下的操作: 第一步,创建一个新的module对象(它可能包含多个module) 第二步,把这个mo ...

  4. selenium + python自动化测试unittest框架学习(四)python导入模块及包知识点

    在写脚本的时候,发现导入某些模块,经常报错提示导入模块失败,这里来恶补下python导入模块的知识点. 1.模块导入时文件查找顺序 在脚本中,import xxx模块时的具体步骤: (1)新建一个mo ...

  5. python 导入模块与使用

    学习python之前一定要了解导入模块是怎么导入的,至少在看代码时不知道能很快的了解别人写的东西是哪里来. Python默认仅安装部分基础或核心模块,启动时也仅加载了基础模块,在需要是再显式的加载其他 ...

  6. python导入模块

    1.模块的定义: 模块定义:用来逻辑上组织python代码(变量.函数.类.逻辑:目的是:实现一个功能),本质就是.py结尾的python文件. 补充: 包的定义:用来从逻辑组织模块的,本质就是一个目 ...

  7. python 导入模块的坑。为什么整个项目能运行,单独运行某个文件模块就报错?多层目录不同文件夹怎么导入?

    一些文章介绍了python不同目录怎么导入问题,但py文件运行起点却从来没有文章说过!这是相当重要的!! 这个连接是网上99%的所讲的导入 https://www.cnblogs.com/luoye0 ...

  8. 转载 Python导入模块的几种姿势

    作为一名新手Python程序员,你首先需要学习的内容之一就是如何导入模块或包.但是我注意到,那些许多年来不时使用Python的人并不是都知道Python的导入机制其实非常灵活.在本文中,我们将探讨以下 ...

  9. Python导入模块Import和from+Import区别

    在我们使用python的时候会发现使用Import可以导入模块,from+Import也可以,那么他们之间有什么区别,该用哪一种呢?让我们来看看 1.首先在demo.py中创建一个变量a,定义一个函数 ...

随机推荐

  1. springcloud-断路器hystrix

    Netflix的创造了一个调用的库 Hystrix 实现了断路器.在微服务架构中,通常有多层服务调用. 底层服务出现故障可能导致用户级联故障.当调用特定服务达到一定阈值时(Hystrix中的默认值为5 ...

  2. Oracle.DataAccess.Client.OracleConnection.Open()报错System. NullReferenceException

    使用ODAC链接Oracle数据库时,conn.Open()报错:未将对象的实例设置到对象引用. Oracle.DataAccess.dll版本:4.121.2.0 ODAC RELEASE 4 Or ...

  3. 2Java基础语法

    1.标识符      1.1 标识符以字母.下划线.美元符开头      1.2 标识符由字母.下划线.美元符或数字组成      1.3 标识符区分大小写      1.4 不能与Java关键字同名 ...

  4. Java虚拟机基础知识你知道多少?

    http://www.cnblogs.com/qlky/p/7401841.html java虚拟机结构 http://liuwangshu.cn/java/jvm/1-runtime-data-ar ...

  5. 用python写桌面天气预报,自己的学习曲线。

    自从接触python,就被他优雅而简洁的代码所吸引. 举个例子: arr , , , , , , , , , , , , , ] ] 如果用其他语言来写的吗,不会这么简洁,美观.   python还有 ...

  6. 小tip:FireFox下文本框/域百分比padding bug解决——张鑫旭

    一.问题描述 我是流体布局控,经常会遇到文本框以及文本域宽度100%自适应显示的情况. 如下效果图: 在窄屏下,上面的文本框宽度也要跟着外部宽度变小. 难点对于文本框或者文本域,光标最好距离左侧边缘有 ...

  7. [js常用]文字转化成语音

    使用百度语音接口,实现文字转化成语音播放 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" &qu ...

  8. css3 3d正反面翻转

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. Python中操作HTTP请求的urllib模块详解

    urllib 是 Python 标准库中用于网络请求的库.该库有四个模块,分别是urllib.request,urllib.error,urllib.parse,urllib.robotparser. ...

  10. Codeforces 981H:K Paths

    传送门 考虑枚举一条路径 \(u,v\),求出所有边经过它的答案 只需要求出 \(u\) 的子树内选出 \(k\) 个可以重复的点,使得它们到 \(u\) 的路径不相交 不难发现,就是从 \(u\) ...