定义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. C#比较两个字符串的相似度【转】

    原文地址:http://www.2cto.com/kf/201202/121170.html 我们在做数据系统的时候,经常会用到模糊搜索,但是,数据库提供的模糊搜索并不具备按照相关度进行排序的功能. ...

  2. [C语言] 数据结构-预备知识跨函数使用内存

    跨函数使用内存 一个函数运行结束,使用malloc函数分配的内存,如果不调用free,就不会释放 在另一个函数中还可以继续使用 #include <stdio.h> #include &l ...

  3. ZUI分页器的使用案例(ECLIPSE SMS项目)

    不足:并未编写导出功能 HTML代码: <form action="${basePath}/SMSLogList.cwai" method="post" ...

  4. 【原】Redis实现生成自增流水号

    场景: 公司内部有个业务场景是后台审核之后需要生成一个流水号,规则是: 201807280001,201807280002,201807280003,后面四位依次递增,前面年月日取当前时间并且转换成y ...

  5. 撩课-Java每天5道面试题第23天

    146.什么是Spring MVC ?简单介绍下你对springMVC的理解? Spring MVC是一个基于MVC架构的 用来简化web应用程序开发的应用开发框架, 它是Spring的一个模块, 无 ...

  6. MVC 使用Quartz.Net组件实现定时计划任务

    最近,项目中需要执行一个计划任务,组长就让我了解一下Quartz.net 这个组件,挺简单的一个组件,实现起来特别的方便,灵活,值得推荐给大家一起学习一下这个小工具.以前我有的时候是使用定时器Time ...

  7. MQ与Webservice的区别

    Webservice 和MQ(MessageQueue)都是解决跨平台通信的常用手段,两者有哪些区别呢? 个人认为最本质的区别在于 Webservice近乎实时通信,而MQ却通常是延时通信. 什么意思 ...

  8. nodejs做的一个测试端口程序

    最近在学习nodejs的http,然后做了一个测试域名有没有使用那些端口,原意是用来做一个本地的静态服务器,然后运行前先测试端口,首先要用到的是net模块,主要用到的是Socket,判断其连接状态即可 ...

  9. html基础-表格-列表(4)

    今天准备为大家准备了表格和列表. 一.文章有各种数据的表格这个网页也不例外. (1).标签意思 <table>----------------------表格开始 <caption& ...

  10. PHP链接mysql 出现:由于目标计算机积极拒绝,无法连接

    1.PHP链接mysql 出现:由于目标计算机积极拒绝,无法连接 2.原因是mysql服务没有启动,图标呈现红色 3.启动服务即可,打开cmd,输入net start mysql即可 4.启动后,图标 ...