一、模块的作用
模块就是一个可执行的py文件,可以将相关复用的代码抽取出来,可以包含类、函数、变量、可执行代码。
使用模块可以使python项目更简洁,可读性更高。
当引入一个模块时会执行被引入模块中的所有代码或者指定的代码至当前的命名空间
二、模块的几种导入方法
- import 语句
将模块中的所有内容都进行导入,同时其中的执行语句都会被执行。
使用其中的变量或者函数,需要使用模块.函数
的方式,如使用test中的filename变量
import test
print(test.filename)
- from…import 语句
可以将模块中的一部分进行导入,导入的变量和函数可以直接使用 - from…import * 语句
同样也是将模块中的变量直接进行导入,导入的变量和函数也可直接使用。
但是使用这种方式需要注意的是模块中的变量会覆盖当前命名空间的同名变量。
三、导入模块的搜索路径
- 1、当前执行文件的目录
- 2、如果不在当前目录,Python 则搜索在 shell 变量 PYTHONPATH 下的每个目录,和linux中的环境变量PATH类似。
- 3、如果都找不到,Python会察看默认路径。UNIX下,默认路径一般为/usr/local/lib/python/
sys.path变量会保存模块的导入路径,因此导入模块时要使用和入口执行文件的相对路径
四、和模块的相关函数
dir()函数
该函数会保存一个py文件中所定义过的变量,特殊字符串变量__name__指向模块的名字,__file__指向该模块的导入文件名
from math import *
content = dir(math)
print content;
#####输出的内容#######
['__doc__', '__file__', '__name__', 'acos', 'asin', 'atan',
'atan2', 'ceil', 'cos', 'cosh', 'degrees', 'e', 'exp',
'fabs', 'floor', 'fmod', 'frexp', 'hypot', 'ldexp', 'log',
'log10', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh',
'sqrt', 'tan', 'tanh']
globals() 和 locals() 函数
- global() 用来返回全局命名空间中的命名
如果在函数内部调用 globals(),返回的是所有在该函数里能访问的全局名字
- locals() 用来返回局部命名空间中的命名
两个函数都是返回字典类型
reload() 函数
reload(module_name),用于重载模块,不用使用字符串类型,直接使用模块名字
reload(math)
五、python的包
包的定义
包是一个分层次的文件目录结构,它定义了一个由模块及子包,和子包下的子包等组成的 Python 的应用环境。包中可以包含你想定义的模块。
简单来说,包就是文件夹,但该文件夹下必须存在 init.py 文件, 该文件的内容可以为空,但如果其中有内容,则在导入模块的时候其中的内容都会执行。一般来说,init.py 用于标识当前文件夹是一个包。
常规导入包
test.py
web1
|-- __init__.py
|-- runoob1.py
web2
|-- __init__.py
|-- runoob2.py
web1/init.py
if __name__ == '__main__':
print('作为主程序运行')
else:
print('package_runoob 初始化')
web1/runoob1.py
def runoob1():
print ("I'm in runoob1")
test.py
from web1 import runoob1
runoob1()
#####
#package_runoob 初始化
#I'm in runoob1
使用相对路径导入包
- . 代表当前路径 …代表上层路径
- 使用相对路径导入包中的模块的条件:该py文件不能为顶层执行文件
test.py
web1
|-- __init__.py
|-- x1.py
web2
|-- __init__.py
|-- x2.py
web2/x2.py
def cal1(x,y):
return x*y
web1/x1.py
from .web2 import x2
print(cal1(2,3)
#如果把web1包中的x1文件作为顶层执行文件,不能使用相对路径进行导入
#会报错‘Parent module '' not loaded, cannot perform relative import’
#需要使用 from web1.web2 import x2来导入