Python的学习之旅———模块与包的使用 常用模块
一:import
导入模块,只会在第一次导入时执行源文件的代码
如果模块已经加载到内存了,下一次导入直接引用内存中导入的结果
eval:提取字符串内的表达式执行,然后返回执行结果
import 导入文件都做了哪些事?
1 以源文件为准产生一个名称空间
2 以刚刚产生的名称空间为准,执行源文件的代码
3 会在当前文件中定义一个名字,这个名字就是模块名,用来引用模块中的名字
为模块起别名
import spam as sm
1 engine_type='mysql' 2 if engine_type == 'mysql': 3 import mysql as engine 4 elif engine_type == 'oracle': 5 import oracle as engine 6 engine.parse()
可以把两个不同的模块引入时候起相同的别名 ,做到调用的时候统一化。小技巧
在一行导入多个模块
1 import sys,os,re
二 使用模块之from ... import...
from spam import read1,read2,moeny
直接导入了spam中的 函数 read1 和read2 的名字 也可以导入变量名字 money
这样使用的时候就不用以spam.read1()的方式调用函数了.
from spam import *
一下把spam.py中的所有名字都引入了
如果引入的模块中有__all__=['字符串函数名','字符串变量名']那么
from spam import * 中* 对应模块spam内的__all__列表内的名字。
三模块的重载
考虑到性能的原因,每个模块只被导入一次,放入字典sys.module中,如果你改变了模块的内容,你必须重启程序,python不支持重新加载或卸载之前导入的模块,
有的同学可能会想到直接从sys.module中删除一个模块不就可以卸载了吗,注意了,你删了sys.module中的模块对象仍然可能被其他程序的组件所引用,因而不会被清楚。
特别的对于我们引用了这个模块中的一个类,用这个类产生了很多对象,因而这些对象都有关于这个模块的引用。
如果只是你想交互测试的一个模块,使用 importlib.reload(), e.g. import importlib; importlib.reload(modulename),这只能用于测试环境。
四py文件模块与脚本的区别
1 编写好的一个python文件可以有两种用途: 2 一:脚本,一个文件就是整个程序,用来被执行 3 二:模块,文件中存放着一堆功能,用来被导入使用 4 5 6 python为我们内置了全局变量__name__, 7 当文件被当做脚本执行时:__name__ 等于'__main__' 8 当文件被当做模块导入时:__name__等于模块名 9 10 作用:用来控制.py文件在不同的应用场景下执行不同的逻辑 11 if __name__ == '__main__':
__name__的判断要在写在模块(脚本程序中)
文件spam.py当做脚本执行,该值等于__main__,文件spam.py当做模块被导入时,该值等于脚本名(spam)
五 模块的搜索路径
模块的查找顺序是:内存中已经加载的模块->内置模块(系统内置那些)->sys.path路径中包含的模块
1 import sys 2 sys.path.append(r'文件路径\a') a是文件夹 3 import m 4 也可以先去找到a 然后顺着a找到m(a和执行文件是在同一个目录下) 5 from a import m
把文件的路径加入系统环境变量中,这是加入一次,而不是永久写入。
六 包介绍
1包是一种通过使用‘.模块名’来组织python模块名称空间的方式
具体的:包就是一个包含有__init__.py文件的文件夹,所以其实我们创建包的目的就是为了用文件夹将文件/模块组织起来 #需要强调的是: 1. 在python3中,即使包下没有__init__.py文件,import 包仍然不会报错,而在python2中,包下一定要有该文件,否则import 包报错 2. 创建包的目的不是为了运行,而是被导入使用,记住,包只是模块的一种形式而已,包的本质就是一种模块
2需要注意的是
#1.关于包相关的导入语句也分为import和from ... import ...两种, 但是无论哪种,无论在什么位置,在导入时都必须遵循一个原则: 凡是在导入时带点的,点的左边都必须是一个包(也就是说文件夹下必须有__init__.py这个文件),否则非法。 可以带有一连串的点,如item.subitem.subsubitem, 但都必须遵循这个原则。但对于导入后,在使用时就没有这种限制了, 点的左边可以是包,模块,函数,类(它们都可以用点的方式调用自己的属性)。 #2、import导入文件时,产生名称空间中的名字来源于文件,import 包,产生的名称空间的名字同样来源于文件,即包下的__init__.py,导入包本质就是在导入该文件 #3、包A和包B下有同名模块也不会冲突,如A.a与B.a来自俩个命名空间
包的标志就是包含__init__.py这个文件。
图列:
模块导入的时候都会做三件事
1 以源文件为准产生一个名称空间 2 以刚刚产生的名称空间为准,执行源文件的代码 3 会在当前文件中定义一个名字,这个名字就是模块名,用来引用模块中的名字
总结
1 import包的时候 建议使用 from ...import的形式。这样就不用sys.path.append(r'包的路径') 2 3 from可以用来指定路径 import决定需要获取的名称空间 4 5 运行文件和包在同一文件夹下的时候 可以直接import 6 7 运行文件和包不在同一文件夹下的时候c:\a\b\c\d\ 运行文件在a下 包在d下 那么就需要在运行文件中首先导入sys.path.append(r'c:\a\b\c\d')
包以及包所包含的模块都是用来被导入的,而不是被直接执行的。而环境变量都是以执行文件为准的
执行文件调用包内名称的方式决定了from 路径结构
第一种
1 执行文件中 2 import a 3 a.f1() 4 a.f2() 5 a.f3()
6 a包 __init__中的代码 7 from .am1 import f1 #等同于绝对路径from a.am1 import f1
8 from .am2 import f2 9 from .b.bm1 import f3
第二种
执行文件中 import a.b.bm1 a.b.bm1.f3()
a包 __init__中没有代码
第三种
1 执行文件中 2 from a.b.bm1 import f3 3 f3()
4 a包 __init__中没有代码
第一种依赖包中__init__ ,第二种是不依赖__init__.