python中import或from使用及模块和包的使用总结

一、简介

1、模块(module):根据python官方的解释,所谓模块就是一个.py文件,用来存放变量,方法的文件,便于在其他python文件中导入(通过import或from);

2、包(package): 包是更大的组织单位,用来组织区别管理多个模块文件;引用官方的说法:"假设你想要设计一个模块(包)来统一处理声音文件和声音数据的集合。有许多不同的声音文件格式(例:.wav,.aiff,.au,.mp3等),因此您可能需要创建和维护不断增长的模块集合,以便在各种文件格式之间进行转换。对于声音数据,您可能还需要执行许多不同的操作(例如混音,添加回声,应用均衡器功能,创建仿真立体声效果),因此除此之外,您还将编写永无止境的模块流这些操作。此时就可以有一个可能的结构(用分层文件系统来表示)"

3、import 用来导入模块(单文件或包中);from 用于从模块(单文件或包中的文件模块)中导入方法(全部或部分)也可用于as 重命名导入的方法名.

包的好处:不管是通过import 还是from 模块(方法)都是通过sys.path中的搜索路径去查找,或程序运行的当前目录.而这种搜索是线性的,所以,如果有两个模块名是一样的,就无法同时导入这两个同名模块中的方法.

了解了包与模块以及import 与from使用区别限制。对我们看源代码项目很有帮助,也便于我们自己组织

项目代码。

百说不如一练,下面通过实例来演示包和模块在使用import和from导入(引用)时的区别.

二、测试环境构建

1、首先我们的实验环境目录如下:

modesdir      #顶层目录

-web      #web包

-web2    #web2包

-__init__.py    #web2包中的__init__.py文件 (python包中必须有__init__.py文件作用后面说)

-hello.py       #web2中的hello文件(模块)

-__init__.py        #web包中的__init__.py文件(模块)

-logger.py         #web包中的logger.py文件(模块)

-webtest.py       #web包中的webtest.py模块

-bin.py

-calculate.py

2、各包(模块中的代码)

#cat calculate.py

#coding:utf-8
print("OK")
_z = "Zz"
x = 3
def add(x,y):
    return  x + y
def sub(x,y):
    return  x -y
def chen(x,y):
    print("from mod")
    return  x * y

#cat web/__init__.py

#coding:utf-8
print("in web1")

#cat web/logger.py

#coding:utf-8
def logger():
    print("logging.")

#cat web/webtest.py

#coding:utf-8
def webTest():
    print("This is web2 test.")

#cat web/web2/__init__.py

#coding:utf-8
print("in web2")

#cat web/web2/hello.py

#coding:utf-8
def hi():
    print("Hello world!")

三、针对模块和包中的模块import

这里以modesdir下的bin.py为入口测试主程序

来做以下测试:

1、导入calculate.py单模块文件

 import calculate
 result = calculate.add(1,2)
 print(result)

结果如下:

注意上面的OK输出 ,说明import时执行了模块中的代码(从上到下)。

2、导入web包中的模块

import web.logger
web.logger.logger()

运行结果如下:

输出多了一个in web1  很明显这是web包下的__init__.py被执行。那么先插一句:

__init__.py :用来给包做一些初始化的工作。可以为空,但必须要有,主要防止区别同名的目录,官方文档中说可以通过在__init__.py中__all__ = [ ] 中放入模块名。这样from  “包”   import * 时可看见的

模块就在__all__中列出的,否则模块不可见。所以这里输出了in web1内容.

3、导入web.web2中的模块

import web.web2.hello
web.web2.hello.hi()

运行结果如图:

这里由于导入了web.web2两个包 所以出现 in web1   in web2内容,可以看出__init__.py作用了吗?

测试,所以可以删除。

如果直接导入包(或包下的包)是什么情况 ?

4、导入web.web2

import web.web2
web.web2.hello.hi()

运行如图:

出错啦。找不到。

结论:

import 导入可以是“ 包.模块 或 包.N包.包.模块 或直接  模块”(当前目录或sys.path环境变量中的)不能是只有包没有模块,换句话说必须以模块结尾,不管是包中的还是单独模块文件调用时
调用时以"[包.]模块.方法(“参数”)"   这里包可选。

四、from的用法

1、从calculate中导入add函数方法

from calculate import add
print(add(1,2))

运行结果如图:

运行结果与上节三 1 下的import调用结果一致。不过调用方式不一样,这里直接调用原模块中的文件名。

2、从web包中导入logger模块中的logger函数方法

from web.logger import logger
logger()

运行如图:

和上节中三 2中import  web.logger.logger()执行一致。

3、从web(包).web2(包).hello模块中导入hi方法

from web.web2.hello import hi
hi()

运行结果:

同样和上节中的3 web.web2.hello.hi()执行结果致。

4、from calculate import *时

from calculate import *
print(_z)

运行结果:

此时_z变量没有找到;另外双下划线__开头(非__双下划线结尾)变量的也是无法找到!

5、__all__ = [] 在from 包 import *时

from web  import *
logger.logger()
webtest.webTest()

运行结果:

上图可以看出在from web import *时 由于__all__中的限制 没有列出webtest模块。所以这里

logger.logger()调用成功,输出logging.而webtest模块提示没有定义 ,找不到。

五、总结

通过以上模拟包和模块的环境 。引入包及包中的模块,单独引用模块中的方法,测试中总结如下:

同名模块可以存在于不同的包中时,必须要用import导入 以包.模块.方法使用。

from 导入的是(包)模块下方法。有可能破坏现有的命名空间中的同名方法。且from 包 import *时

受__init__.py中的__all__影响,没有列出来的模块是没法导入引用的。而from 模块 import *时,以下线线_开头的私有变量受到影响没法引用。

以上测试在2.x及3.x均可,以上代码在3.5.2下通过。

时间: 2024-10-09 08:08:49

python中import或from使用及模块和包的使用总结的相关文章

Python中import导入上一级目录模块及循环import问题的解决

使用python进行程序编写时,经常会使用第三方模块包.这种包我们可以通过python setup install 进行安装后,通过import XXX或from XXX import yyy 进行导入.不过如果是自己遍写的依赖包,又不想安装到python的相应目录,可以放到本目录里进行import进行调用:为了更清晰的理清程序之间的关系,例如我们会把这种包放到lib目录再调用.本篇就针对常见的模块调用方法汇总下. 一.同级目录下的调有 程序结构如下: -- src     |-- mod1.p

当你在 python中 import不到模块的时候

在 python中 import sys print sys.path 看一看模块的 引用路径 ,再看一看你的 模块路径 在不在这里面 rpm -ql .....你的模块(package) 如果不存在,那么就在 /etc/profile最后一行加上 export PYTHONPATH=$PYTHONPATH:你那个包的 路径 完成后保存退出 输入 source /etc/profile 再打开新的终端,看看在python直接import那个包行不行

python中import的机制与实现

原文出处: 刘畅(@你猜我猜不猜猜你是谁) 概述 Python 是一门优美简单.功能强大的动态语言.在刚刚接触这门语言时,我们会被其优美的格式.简洁的语法和无穷无尽的类库所震撼.在真正的将python应用到实际的项目中,你会遇到一些无法避免的问题.最让人困惑不解的问题有二类,一个 编码问题,另一个则是引用问题. 本文主要讨论关于Python中import的机制与实现.以及介绍一些有意思的Python Hooks. Python 类库引入机制 首先,看一个简单的例子: """

Python中import, from...import,import...as的区别

在python中import或者from…import是用来导入相应的模块. 举个例子: import datetime print(datetime.datetime.now()) 以上代码实现输出系统当前时间,是引入整个datetime包,然后再调用datetime这个类中的now()方法. 以上代码实现功能也可以用以下代码实现: from datetime import datetime print(datetime.now()) 这里是从datetime包中只导入datetime这个类,

python's twenty eithth day for me 模块和包

模块: 什么是模块: 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀,但其实import加载的模块分为四个通用类别: 1,使用python编写的代码(.py文件) 2,以被编译为共享库或DLL的C或C++扩展. 3,包好一组模块的包. 4,使用C编写并链接到python解释器的内置模块. import: import 模块名: 1,导入一个模块. 2,相当于这个模块从上到下一次被执行了. 3,同一个模块不会被多次导入. import my_mo

python中import或from...   import用法

在python用import或from...import来导入相应的模块. 模块是一些函数和类的集合文件,它能实现一些相应的功能,当我们需要使用这些功能的时候,直接把相应的模块导入到我们的程序中,我们就可以使用了.例如: from common import * import util import miniCurl import os os.getcwd()

python中import和from...import区别

在python用import或者from...import来导入相应的模块.模块其实就是一些函数和类的集合文件,它能实现一些相应的功能,当我们需要使用这些功能的时候,直接把相应的模块导入到我们的程序中,我们就可以使用了.这类似于C语言中的include头文件,Python中我们用import导入我们需要的模块. eg: import sysprint('================Python import mode==========================');print ('T

python中import和from-import的区别

. import导入模块的路径两种方式 # 将模块所在路径再程序中添加到sys.path列表中 import sys sys.path import导入模块按照sys.path顺序依次查找,""代表当前路径 # 修改操作系统的PYTHON_PATH环境变量 # 系统的环境变量 export PYTHON_PATH=$PYTHON_PATH:新的路径 . import 模块名 和 from 模块名 import * 是不同的; 1. 调用模块属性的区别 import 模块名 模块名.xx

python之基础篇(八)——模块与包

防伪码:忘情公子著 python中的模块 将代码量较大的程序分割成多个有组织的.彼此独立但又能互相交互的代码片段,这些自我包含的有组织的代码段就是模块. 模块在物理形式上表现为以.py结尾的代码文件: 一个文件被看作一个独立的模块,一个模块也可以被看作是一个文件 模块的文件名就是模块的名字加上扩展名.py 每个模块都有自己的名称空间 python允许"导入"其它模块以实现代码重用,从而也实现了将独立的代码文件组织成更大的程序系统: 在python中,模块也是对象 在一个模块的顶层定义的