概念: 在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. 转 11g RAC R2 体系结构---Grid

    基于agent的管理方式 从oracle 11.2开始出现了多用户的概念,oracle开始使用一组多线程的daemon来同时支持多个用户的使用.管理资源,这些daemon叫做Agent.这些Agent ...

  2. C. Hongcow Builds A Nation 并查集

    http://codeforces.com/contest/745/problem/C 把他们并查集后, 其他没有连去government的点,全部放去同一个并查集,然后选择一个节点数最多的gover ...

  3. [转]为革命保护视力 --- 给 Visual Studio 换颜色

    本文转自:http://www.cnblogs.com/stg609/p/3723968.html “为革命,保护视力,预防近视,眼保健操开始......” 这个应该是最老版本的眼保健操了,你听过? ...

  4. 工作中js和jquery 函数收集

    1. 判断单选框是否选中  $("xxx").is(":checked")       返回类型是 true/false 2. $(this)[0].nextS ...

  5. [BZOJ1008][HNOI2008]越狱 组合数学

    http://www.lydsy.com/JudgeOnline/problem.php?id=1008 正着直接算有点难,我们考虑反着来,用全集减补集. 总的方案数为$m^n$.第一个人有$m$种可 ...

  6. Android(java)学习笔记190:ContentProvider使用之学习ContentProvider(内容提供者)的目的

    1. 使用ContentProvider,把应用程序私有的数据暴露给别的应用程序,让别的应用程序完成对自己私有的数据库数据的增删改查的操作. 2. ContentProvider的应用场景: 获取手机 ...

  7. jquery 移动端 六位密码输入

    <!DOCTYPE html> <html> <head> <script src="scripts/jquery-1.7.1.min.js&quo ...

  8. JS的type类型为 text/template

    JS标签中有时候会看见<script type="text/tmplate" >,大概就是一个放置模板的地方,而这些东西并不显示在页面 在js里面,经常需要使用js往页 ...

  9. freenas 系统可能存在的bug

    1.portal 中ip端口显示有问题. 2.创建extend/target映射之后重启iscsi服务有的时候不能启动. 3.后台/usr /etc 重启系统会自动还原.

  10. HTML location 用法(获取当前URL)

    Location 对象 Location 对象包含有关当前 URL 的信息. Location 对象是 Window 对象的一个部分,可通过 window.location 属性来访问. 属性 loc ...