概念: 在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. Matlab实现图像分割 分类: 图像处理 2014-06-14 21:31 662人阅读 评论(1) 收藏

    下面使用极小值点阈值选取方法,编写MATLAB程序实现图像分割的功能. 极小值点阈值选取法即从原图像的直方图的包络线中选取出极小值点, 并以极小值点为阈值将图像转为二值图像 clear all; cl ...

  2. 【先定一个小目标】Asp.net Core 在IIS上的托管运行

    1.安装 .NET Core Framework 下载.net core地址:官网地址 2.Install IIS 在控制面板->程序与功能->Internet Infomation Se ...

  3. jQuery 常见面试题

    一 :Q: What is the difference between .get(), [], and .eq()? A: eq返回原生jQuery对象,截取某些el元素生成Jquery新对象 ge ...

  4. ActionEvent之TextField

    这里我们讲这个TestField类 也就是我们的输入框,什么输入密码,用户名什么的. 一些方法: 这里说到TestField也会有事件发生,就是当你在文本框敲回车的时候. 看个例子: import j ...

  5. JDK常用类解读--String

    一.字符串的不变性: 文章使用的源码是jdk1.8的.(下同) 1.首先可以看到`String`是`final`类,说明该类不可继承,保证不会被子类改变语义 2.String的值实际上就是一个字符数组 ...

  6. preg_replace_callback使用方法

    官网解释: 执行一个正则表达式搜索并且使用一个回调进行替换 (PHP 4 >= 4.0.5, PHP 5) preg_replace_callback — 执行一个正则表达式搜索并且使用一个回调 ...

  7. webpack3.0版本的一些改动

    npm install --save / npm install -S 项目发布上线之后还会依赖用到的插件,没有这些插件,项目不能运行 npm install --save-dev / npm ins ...

  8. mysql 插入多条记录,重复值不插入

    只去除主键与唯一索引的字段,字段为null时 是可以重复插入的domo: insert ignore into table_name(email,phone,user_id) values('test ...

  9. Mysql:is not allowed to connect to this MySQL server [转]

    原文链接http://www.blogjava.net/acooly/archive/2008/09/17/229368.html 如果你想连接你的mysql的时候发生这个错误:ERROR 1130: ...

  10. PHP网络协议相关考点

    HTTP状态码 HTTP状态码(HTTP Status Code)是用以表示网页服务器HTTP响应状态的3位数字代码. HTTP状态码主要有5种,代表5种不同类型的响应: 1xx:信息性状态码,代表接 ...