概念: 在Python中,一个.py文件就称之为一个模块(Module)

好处:

1. 提高可维护性

2. 可重用

3. 避免函数名、变量名冲突。 每个模块有独立的命名空间,因此相同名字的函数和变量完全可以分别存在不同的模块中。因此我们自己在编写模块时,不必考虑名字会与其他模块冲突

模块种类:

1. 内置标准模块(标准库)。执行help(‘modules’)查看所有Python自带模块列表

2. 第三方开源模块,可通过 pip install 模块名 联网安装

3. 自定义模块

模块的导入路径:

模块调用:

import module       # 整个模块都导入

from module import xx   #  从某个模块里面导入它的一个小模块, 如: from random import randint     (这种方法导入的模块用的时候直接:randint(x,x)就行,前面就不用再加random.  , 因为你都没有导入random模块), 利用这种方法可以导入多个小模块,中间加逗号(“ , ”)就行。

from module.xx.xx import xx as rename   # 从模块的某个目录下导入某个小模块(或者是文件夹的形式),如: from django.core import handlers  。 as rename是对导入的模块在你这个程序中重命名,如:import multiprocessing as mulpro     以后在你这个程序中利用 mulpro. 就行

from module.xx.xx import  *     #  从模块的目录下导入所有的小模块,以后调用小模块的时候就不用再在小模块前加大模块的前缀, 如: from socket import *      在你的程序里调用socket的小模块时,直接写小模块的名字就行, 前面不需要再加 socket. 。 注意: 不建议用这种方式导入, 有可能这个小模块名跟你程序的变量名或者你导入的其他模块的小模块名发生重名冲突。

注: 模块一旦被调用,就相当于执行了另一个py文件里的代码, 如:

导入自己写的py文件:

自己写的 import练习.py 文件内容如下:

def sayhi(cmd):
print('hello',cmd) def saybye(cmd):
print('bye',cmd)

导入如下:

上面的 import练习.py 文件如果改成:

def sayhi(cmd):
print('hello',cmd) def saybye(cmd):
print('bye',cmd) sayhi('abc')

import import练习.py这个文件后,会直接打印“heoll,abc ”,因为调用这个模块就相当于把这个py文件中的代码从上到下走了一遍

从上面的导入图可以看出,我导入的时候是专门进入到文件所在的目录去import的, 那是因为导入的时候Python并不会去系统的全局去寻找你所导入的文件,如果你专门进入了某个目录启动Python,它会在这个目录中搜寻并导入,如果你没写导入目录,它会去默认的路径中去搜寻, 查看默认路径的方法:

import sys
sys.path # 通过以上代码会打印出它的默认搜索路径。
# 我电脑的搜索结果:
# ['', 'D:\\python\\Lib\\idlelib', 'D:\\python\\python36.zip', 'D:\\python\\DLLs', 'D:\\python\\lib', 'D:\\python', 'D:\\python\\lib\\site-packages', 'D:\\python\\lib\\site-packages\\chardet-3.0.4-py3.6.egg'] # 在这个列表中的路径从左到右寻找,第一对引号下面表示是“当前目录”,所以默认是先从当前目录去找,如果当前目录没找到,就往后依次找。 sys.path是个列表,你也可以自己利用sys.path.append()往里面添加路径,但你自己导入的这个路径只是在你这个程序里面添加了,在其他程序里面的sys.path里面是没有的,当你把这个程序关闭后,就不能利用你自己添加的那个路径,也就是说这个路径是一次性,只在你这个程序中有效。 # 'D:\\python\\Lib\\idlelib', 'D:\\python\\python36.zip'
#'D:\\python\\DLLs', 'D:\\python\\lib', 'D:\\python', # 这些是Python自带的安装包相关的东西

# site-packages  # 所有的标准库,包括自己安装的第三方库

注:import module 是导入到内存中了

开源模块安装方式:

https://pypi.python.org/pypi  是Python的开源模块库

安装方式:

1. 手动安装:  在cmd中进入所需安装模块的目录,在命令行输入: python setup.py build

build成功后在命令行再输入: python setup.py install

注:安装在了Python的site-packages下

2. 联网安装: pip install 模块名

3. 国内资源下载:

包:(Package)

当你的模块文件越来越多,就需要对模块文件进行划分,比如把负责跟数据交互的都放在一个文件夹中,把与页面交互相关的放在一个文件夹。

像上面这样,一个文件夹管理多个模块文件,这个文件夹就被称为包。

假如我运行 manage.py并需要导入crm文件下的 views.py, 由于crm文件跟 manage.py在文件夹my_proj是同一层,可以如下导入:

from crm import views  # 所需要导入的文件在crm的多少层, 导入的时候就在 crm后面加多少个点, 如: crm.xx.xx.xxx

views.xx()   

以上是Python3的导入方法。 Python2导入自写文件夹时,需要在导入的文件夹中加上一个命名为“__init__.py ”(init两边各两个下划线, init是initiate(初始化)的缩写)的空文件,这样自写的文件夹就变成了包。

就是说,Python2只有在文件夹中加入了“__inti__.py”这个空文件,这个文件夹才会变成包,但Python3加不加这个“__init__.py”空文件都无所谓,但为了规范,最好加上。

运行的 manage.py的时候导入了 crm 下的 views.py ,  如果views.py 又需要导入 配置文件 my_proj 下的settings.py ,可以如下导入:

from my_proj import settings  # my_proj是配置文件

settings.xx()

# 正常来说, 由于views.py 和 setting.py 没在同一个文件夹中,也没像manage.py和crm 在同一级别, 这样导入是不行的。 但由于 manage.py 在导入 views.py 的时候,已经把 manage.py 所在的变量添加到了环境变量(即 sys.path这个列表中的第一个元素)中,所以 这次导入的时候,Python会搜索 manage.py 所在路径下的所有文件(只会在manage.py这一层找)。
# 所以说, 把路径添加到环境变量中的时候, 添加的是程序的主入口函数(即:manage.py)所在的路径, 而跟导入的模块(如: views.py)所在的位置、导入文件时进入了多少层没有一点关系。

相对导入:

cd.. 是返回上一层文件夹

cd..\.. 是往上返回两层   这个 .. 就是指相对路径

还是上面的例子, manage.py 调用views.py, views.py 需要调用同目录下的 models.py,在views.py中导入models.py时不能这样写: import models   。 因为,主函数是 manage.py,所以只是manage.py 所在的路径添加到了 os.path中了, 所以 Python只会在 manage.py这一层去寻找 models。所以,即使views.py和 models.py是在同一目录下,也不能直接导入。

导入同一目录下的py文件,可以用以下写法:

from . import module  # from . 就表示当前目录下导入。  这个 . 就叫做相对的导入

在涉及到相对导入时,package所对应的文件夹必须正确的被Python解释器视作package,而不是普通文件夹。否则由于不被视作package,无法利用package之间的嵌套关系实现Python中包的相对导入。

文件夹被Python解释器视作package需满足两个条件:

1. 文件中必须有__inti__.py 文件,该文件可以为空,但必须存在该文件。

2. 该文件夹中的py文件不能作为顶层模块来执行(即不能作为主函数的入口)。 (相对导入不能相对到了程序的根目录)

注: 虽然Python支持相对导入,但对模块间的路径关系要求比较严格,处理不当就容易出错,所以不建议在项目里经常使用(form . 用的比较多一点,from .. 用的比较少)

Python模块基础的更多相关文章

  1. Python基础篇【第5篇】: Python模块基础(一)

    模块 简介 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就 ...

  2. 18、Python模块基础

    一.模块 模块可以看成是一堆函数的集合体. 一个py文件内部就可以放一堆函数,因此一个py文件就可以看成一个模块. 如果这个py文件的文件名为module.py,模块名则是module. 1.模块的四 ...

  3. python 模块基础介绍

    从逻辑上组织代码,将一些有联系,完成特定功能相关的代码组织在一起,这些自我包含并且有组织的代码片段就是模块,将其他模块中属性附加到你的模块的操作叫做导入. 那些一个或多个.py文件组成的代码集合就称为 ...

  4. python模块基础之json,requeste,xml,configparser,logging,subprocess,shutil。

    1.json模块 json     用于[字符串]和 [python基本数据类型] 间进行转换(可用于不同语言之前转换),json.loads,将字符串转成python的基本数据类型,json.dum ...

  5. python 模块基础 和常用的模块

    模块的定义 一个模块就是以.py结尾的python 文件,用来从逻辑上组织python代码.注意,模块名和变量名一样开头不能用数字,可以是双下划线和字母. 为什么要用模块? 将一些复杂的需要重复使用的 ...

  6. python模块基础之OS模块

    OS模块简单的来说它是一个Python的系统编程的操作模块,可以处理文件和目录这些我们日常手动需要做的操作. 可以查看OS模块的帮助文档: >>> import os #导入os模块 ...

  7. python模块基础之getpass模块

    getpass模块提供了可移植的密码输入,一共包括下面两个函数: 1. getpass.getpass() 2. getpass.getuser() getpass.getpass([prompt[, ...

  8. python模块导入原理

    转自:http://blog.csdn.net/u012422440/article/details/41791433 今日在自学Python,借此机会,正好重新开始写博文,既可以巩固python的知 ...

  9. Python入门基础学习(模块,包)

    Python基础学习笔记(五) 模块的概念:模块是python程序架构的一个核心概念 每个以拓展名py结尾的python源代码文件都是一个模块 模块名同样也是一个标识符,需要符合标识符的命名规则 在模 ...

随机推荐

  1. 分享一款强大的图片查看器插件,手机PC 通吃,功能超级齐全!

    一款强大的图片查看器插件,手机PC 通吃,功能超级齐全! 地址:http://photoswipe.com/

  2. AJPFX分析Android退出应用最优雅的方式

    什么是RS式呢?即Receiver+singleTask .我们知道Activity有四种加载模式,而singleTask就是其中的一种,使用这个模式之后,当startActivity时,它先会在当前 ...

  3. 死磕 java集合之LinkedList源码分析

    问题 (1)LinkedList只是一个List吗? (2)LinkedList还有其它什么特性吗? (3)LinkedList为啥经常拿出来跟ArrayList比较? (4)我为什么把LinkedL ...

  4. 在Windows7下编译调试C#程序

    要在 命令行下编译C#代码,要配置一下 1.在环境变量下新建一个变量 参数名: csc 参数值:C:\Windows\Microsoft.NET\Framework\v4.0.30319 2.在系统变 ...

  5. vim插件minibuf配置

    1.去下载网站下载minibufexpl.vim文件放入到~/vim/plugins中,有的系统路径是~/.vim/plugins; 下载网址如下 https://www.vim.org/script ...

  6. iOS Programming UISplitViewController

    iOS Programming UISplitViewController  The iPad, on the other hand, has plenty of screen space to pr ...

  7. Python学习 Day 9 property 多重继承 Mixin

    在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改: s = Student() s.score = 9999 为了限制score的范围,可以通过一 ...

  8. CentOS 6.4 linux下编译安装MySQL5.6.14

    CentOS 6.4下通过yum安装的MySQL是5.1版的,比较老,所以就想通过源代码安装高版本的5.6.14. 正文: 一:卸载旧版本 使用下面的命令检查是否安装有MySQL Server rpm ...

  9. connection timeout 和command timeout

    每次对数据库连接时,我们有时候会碰到连接超时或者命令超时,这两个超时是不一样的.以ADO.NET为例,当客户端和服务器端连接时,碰到的超时情况主要有下面几种: ''' 当从连接池获取一个连接时,碰到超 ...

  10. PHP流程控制考察点

    php遍历数组的三种方法及各自的区别 php遍历数组的方式主要有三种: for循环 foreach循环 while.list().each()组合循环 其中: for循环只能遍历索引数组,foreac ...