前言

在开发过程中,为了编写可维护的代码,我们会将很多函数进行分组,放到不同的文件中去。这样每个包的代码相对来说就会减少,也利于后期的维护和重复的使用。很多编程语言都采用这样的组织代码方式,在python中,一个'.py'文件就被称为是一个模块。很多时候我们我们编写代码也不用从头开始编写,因为当一个模块编写完毕,就可以别其他地方引用,我们在编写程序的时候经常引用其他的模块。

常见的模块又分为三种:

  • python标准库,就是python为我们提供的经常使用的模块
  • 第三方模块
  • 自定义模块

包的使用

如果不同的人编写的模块名相同怎么办?为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package)。

举个例子,一个abc.py的文件就是一个名字叫abc的模块,一个xyz.py的文件就是一个名字叫xyz的模块。

现在,假设我们的abcxyz这两个模块名字与其他模块冲突了,于是我们可以通过包来组织模块。这个包就相当于是创建了一个文件夹。引入了包以后,只要顶层的包名不与别人冲突,那所有模块都不会与别人冲突。

请注意,每一个包目录下面都会有一个__init__.py的文件,这个文件是必须存在的,否则,Python就把这个目录当成普通目录(文件夹),而不是一个包。__init__.py可以是空文件,也可以有Python代码,因为__init__.py本身就是一个模块,而它的模块名就是对应包的名字。

调用包就是执行包下的'__init__.py'文件。

模块的导入

关于模块导入,我们要先了解一些事情:

  1. 当我们运行一段程序,都会有一个启动的文件。
  2. 当我们导入一个模块的时候,python解释器寻找对于文件的时候会有自己的搜索路径顺序,这个顺序在sys.path中存放着。
  3. 当我们引入一个文件的时候,它会先执行这个文件中的内容。如果想看看的话,不妨自定义一个模块,然后在里面放入print语句,再调用这个模块看看效果。
  4. 如果我们引入的模块中有和当前模块中同名的函数,引入的模块就会被屏蔽。

import语句

import用于导入和启动文件同目录下的模块

格式:

import module1[, module2[,... moduleN]

from..import语句

这个语句是引用和启动文件同目录下的包中的模块

格式:

from modname import name1[, name2[, ... nameN]]

这个声明不会把整个modulename模块导入到当前的命名空间中,只会将它里面的name1或name2单个引入到执行这个声明的模块的全局符号表。

还有一种特殊的:

from modname import *

这提供了一个简单的方法来导入一个模块中的所有项目。然而这种声明不该被过多地使用。大多数情况, Python程序员不使用这种方法,因为引入的其它来源的命名,很可能覆盖了已有的定义。

特殊的例子

上图是目录结构

下面说下文件中的内容

__init__.py:空

modue1.py:

def show_num():
print("")

modue2.py:

import modue1

modue1.show_num()

bin.py:

from demo import modue2

当我运行modue2.py的时候,显示:

当我运行bin.py的时候,显示:

可以看到找不到包了,产生这个问题的原因就是启动文件是谁的问题。由于启动文件的不同,目录层级不同,导致的搜索路径问题,

我们可以修改bin.py文件:

import sys
print(sys.path)
from demo import modue2

得出

我们在modue2中引入了modue1,它的所在目录是modue下的demo文件夹,而可以看到引包是搜索路径中并没有,所以产生了引包的问题。

解决的方式有两种

第一种:修改modue2中的引包方式

from . import modue1

第二种:修改sys.path

修改后的modue2如下

import sys, os

BASE_DIR = os.path.dirname(os.path.abspath(__file__))
sys.path.append(BASE_DIR)
import modue1 modue1.show_num()

注:这个只是临时修改环境变量

关于启动文件

如果一个模块是启动文件的话,我们可以常常看到这样一句:

if __name__ == '__main__':

这句话就是判断是不是启动文件的。

在上面的那个特殊的例子中的bin.py加入:

print(modue2.__name__)      # demo.modue2
print(__name__) # __main__

可以看到,当以该模块作为启动文件的时候,它的"__name__"为"__main__",而作为引用的modue2的"__name__"则为"demo.modue2"。

其实在一些功能模块中也会有这样一个判断主模块的语句,因为,模块在进行调试的时候,一般也是在本模块中进行调试,所以会加入这样一句用来调试。而当这个模块被引用的时候,则只会将其功能函数调走,不会执行这个判断语句为真后的调试命令。所以它也起了隔离的效果。

python的模块的更多相关文章

  1. Python标准模块--threading

    1 模块简介 threading模块在Python1.5.2中首次引入,是低级thread模块的一个增强版.threading模块让线程使用起来更加容易,允许程序同一时间运行多个操作. 不过请注意,P ...

  2. Python的模块引用和查找路径

    模块间相互独立相互引用是任何一种编程语言的基础能力.对于“模块”这个词在各种编程语言中或许是不同的,但我们可以简单认为一个程序文件是一个模块,文件里包含了类或者方法的定义.对于编译型的语言,比如C#中 ...

  3. Python Logging模块的简单使用

    前言 日志是非常重要的,最近有接触到这个,所以系统的看一下Python这个模块的用法.本文即为Logging模块的用法简介,主要参考文章为Python官方文档,链接见参考列表. 另外,Python的H ...

  4. Python标准模块--logging

    1 logging模块简介 logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级.日志保存路径.日志文件回滚等:相比print,具备如下优点: 可以通过设置不同 ...

  5. python基础-模块

    一.模块介绍                                                                                              ...

  6. python 安装模块

    python安装模块的方法很多,在此仅介绍一种,不需要安装其他附带的pip等,python安装完之后,配置环境变量,我由于中英文分号原因,环境变量始终没能配置成功汗. 1:下载模块的压缩文件解压到任意 ...

  7. python Queue模块

    先看一个很简单的例子 #coding:utf8 import Queue #queue是队列的意思 q=Queue.Queue(maxsize=10) #创建一个queue对象 for i in ra ...

  8. python logging模块可能会令人困惑的地方

    python logging模块主要是python提供的通用日志系统,使用的方法其实挺简单的,这块就不多介绍.下面主要会讲到在使用python logging模块的时候,涉及到多个python文件的调 ...

  9. Python引用模块和查找模块路径

    模块间相互独立相互引用是任何一种编程语言的基础能力.对于"模块"这个词在各种编程语言中或许是不同的,但我们可以简单认为一个程序文件是一个模块,文件里包含了类或者方法的定义.对于编译 ...

  10. Python Paramiko模块与MySQL数据库操作

    Paramiko模块批量管理:通过调用ssh协议进行远程机器的批量命令执行. 要使用paramiko模块那就必须先安装这个第三方模块,仅需要在本地上安装相应的软件(python以及PyCrypto), ...

随机推荐

  1. script脚本中写不写$(document).ready(function() {});的区别

    $(document).ready() 里的代码是在页面内容都加载完才执行的,如果把代码直接写到script标签里,当页面加载完这个script标签就会执行里边的代码了,此时如果你标签里执行的代码调用 ...

  2. 方法引用(Method reference)和构造器引用(construct reference)

    Java 8 允许你使用 :: 关键字来传递方法或者构造函数引用 方法引用语法格式有以下三种: objectName::instanceMethod ClassName::staticMethod C ...

  3. 登录mysql数据库出现 : ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: NO) ER或者忘记密码

    1.     在安装mysql的文件目录中找到配置文件my.ini  ,然后右击用记事本打开 2.     打开后,搜索mysqld关键字 找到后,在mysqld下面添加skip-grant-tabl ...

  4. table表格td内内容自动换行

    项目开发时,遇到问题:td内传入数据,全是字母,不会自动换行 一般字母数字/特殊符号的话,会被浏览器默认是一个字符串或者说一个单词,不会自动换行 所以需要设置一下,让表格内容自动换行. 1.给td标签 ...

  5. Debug view 是个好工具

    有时候不用 VS 调试, 在 代码里面加入 Debug.Writeline(" Debug information!!");  这个时候打开 debug view 就可以检测出输出 ...

  6. ComponentOne、Spread、ActiveReports 5折起 加入惊喜惠

    慧都十周年,GrapeCity也来共襄盛举,旗下三大产品产品线齐齐参与.界面控件套包ComponentOne.Excel表格控件Spread与报表开发工具ActiveReports,指定授权5折起加入 ...

  7. 【起航计划 013】2015 起航计划 Android APIDemo的魔鬼步伐 12 App->Activity->SetWallpaper 设置壁纸 WallpaperManager getDrawingCache使用

    SetWallpaper介绍如何在Android获取当前Wallpaper,对Wallpaper做些修改,然后用修改后的图像重新设置Wallpaper.(即设置>显示>壁纸>壁纸的功 ...

  8. Trouble Shooting的一些感想(实时补充)

    最近一直做两个产品功能的Merge工作,代码Merge过来之后,发现了很多问题.经过Trouble Shooting,最终发现归根结底都是我们Merge的问题,例如有的Code没有Merge过来,Me ...

  9. 一、Dapper基本操作

    参考资料:Cooper Liu 毒逆天 一.Dapper安装 添加引用-->NuGet管理-->搜索Dapper-->安装 二.新建表 --创建一个员工表 create table ...

  10. Git学习笔记day01 从GitHub克隆版本库

    本期Git教程将会带您进入Git的世界,这是您使用分布版本控制工具Git的开端,祝您学习顺利! 步骤一  在Linux系统中下载Git 如果是Ubuntu系统,在shell中输入指令 sudo apt ...