一、模块介绍
1、模块定义
用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能),本质上就是.py结尾python文件。
分类:内置模块、开源模块、自定义模块。
2、导入模块
本质:导入模块的本质就是把python文件解释一遍;导入包的本质就是把包文件下面的init.py文件运行一遍。
1. 同目录下的模块导入
1 #同级目录间import 2 3 import module_name #直接导入模块 4 import module_name,module2_name #导入多个模块 使用:模块名.加函数名 5 from module_name import * #导入模块中所有函数和变量等。。不建议使用 6 from module_name import m1,m2,m3 #只导入模块中函数m1,m2,m3 使用:直接使用m1,m2,m3即可 7 from module_name import m1 as m #导入module_name模块中m1函数并且重新赋值给m 使用:直接输入m即可
2.不同目录下的模块导入
1 #不同目录之间import 当前文件main.py 2 3 #目录结构 4 # ├── Credit_card 5 # │ 6 # ├── core # 7 # │ ├── __init__.py 8 # │ └── main.py # 当前文件 9 # ├── conf # 10 # │ ├── __init__.py 11 # │ └── setting.py 12 # │ └── lzl.py 13 14 import sys,os 15 16 creditcard_path=os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #当前目录的上上级目录绝对路径,即Creditcard目录 17 sys.path.insert(0,creditcard_path) #把Creditcard目录加入到系统路径列表第0个 18 19 print(sys.path) #打印系统环境路径 20 #['C:\\Users\\L\\PycharmProjects\\s14\\Day5\\Creditcard,.......] 21 22 #import settings.py #无法直接import 23 #ImportError: No module named 'settings' 24 25 from conf import settings #from目录import模块 26 27 settings.set() #执行settings下的函数 28 #in the settings
3.不同目录下模块连坏导入
目录结构 ├── Credit_card │ ├── core # │ ├── __init__.py │ └── main.py # 当前文件 ├── conf # │ ├── __init__.py │ └── setting.py │ └── lzl.py 目录结构
conf目录下的文件:
lzl.py
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 #-Author-Lian 4 5 #当前文件lzl.py 6 def name(): 7 print("name is lzl") 8 9 lzl.py
setting.py
1 #当前文件settings,调用lzl.py模块 2 import lzl #导入模块lzl 3 4 def set(): 5 print("in the settings") 6 lzl.name() #运行lzl模块下的函数 7 8 set() #执行函数set 9 #in the settings 10 #name is lzl
此时执行settings.py文件没有任何问题,就是同一目录下的模块之间的导入,关键来了,此刻croe目录下的main.py导入模块settings会出现什么状况呢??!
core目录下的文件:
main.py
1 #不同目录之间连环import 当前文件main.py 2 import sys,os 3 4 creditcard_path=os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #当前目录的上上级目录绝对路径,即Creditcard目录 5 sys.path.insert(0,creditcard_path) #把Creditcard目录加入到系统路径 6 7 from conf import settings 8 9 settings.set() #执行settings下的函数 10 # import lzl #导入模块lzl 11 #ImportError: No module named 'lzl'
可以看到直接报错:ImportError: No module named 'lzl',想想什么会报错类?!
刚才已经说到了,导入模块的本质就是把模块里的内容执行一遍,当main.py导入settings模块时,也会把settings里的内容执行一遍,即执行import lzl;
但是对于main.py来说,不能直接import lzl,所有就出现了刚才的报错,那有什么办法可以解决?!
对conf目录下settings.py文件进行修改
1 #当前文件settings,调用lzl.py模块 2 from . import lzl #通过相对路径导入模块lzl 3 4 def set(): 5 print("in the settings") 6 lzl.name() #运行lzl模块下的函数 7 8 set() #执行函数set 9 #in the settings 10 #name is lzl
此时执行main.py文件
1 #不同目录之间连环import 当前文件main.py 2 import sys,os 3 4 creditcard_path=os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #当前目录的上上级目录绝对路径,即Creditcard目录 5 sys.path.insert(0,creditcard_path) #把Creditcard目录加入到系统路径 6 7 from conf import settings 8 9 settings.set() #执行settings下的函数 10 # in the settings 11 # name is lzl
没有任何报错,我们只对settings修改了lzl模块的调用方式,结果就完全不同,此时的from . import lzl 用到的是相对路径,这就是相对路径的优点所在。
4、不同目录多个模块互相导入,用相对路径
目录结构:
Day5 ├── Credit_card ├── README.md ├── core │ ├── __init__.py │ └── main.py ├── conf │ ├── __init__.py │ └── setting.py │ └── lzl.py 目录结构
conf目录下的文件:
lzl.py
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 #-Author-Lian 4 5 #当前文件lzl.py 相对路径 6 def name(): 7 print("name is lzl")
setting.py
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 #-Author-Lian 4 5 #当前文件settings,调用lzl.py模块 相对路径 6 from . import lzl #通过相对路径导入模块lzl 7 8 def set(): 9 print("in the settings") 10 lzl.name() #运行lzl模块下的函数 11 12 set() #执行函数set 13 #in the settings 14 #name is lzl 15 16 settings
core目录下的文件:
main.py
1 #不同目录之间连环import 当前文件main.py 相对路径 2 3 from Day5.Credit_card.conf import settings 4 5 6 settings.set() #执行settings下的函数 7 # in the settings 8 # name is lzl
lzl.py以及settings.py文件未变,main.py文件去掉了繁杂的sys.path添加的过程,直接执行from Day5.Credit_card.conf import settings,使用相对路径,更加简洁方便!