Python_12模块基础、导入、执行顺序
一、模块
在Python中,一个.py文件就称之为一个模块(Module)。即一个文件看作一个独立的模块,一个模块也可以看作是一个文件。使用模块可以避免函数名和变量名冲突。相同名字的函数和变量完全可以分别存在不同的模块中,因此,在编写模块时,不必考虑名字会和其他模块冲突。但是也要注意,尽量不要与内置函数名字冲突。
1.内置模块:如sys,os,subprocess,time,json等等,使用代码查看模块print(help('module'))
2.自定义模块:不能和Python自带模块名称冲突,例如系统自带了sys模块,自己定义的模块就不能命名为sys.py,否则将无法导入系统自带的sys模块。
3.开源模块:公开的第三方模块,如https://pypi.org/。可以使用pip install 安装,类似于手机app应用市场或者maven仓库。
1 #第四章第一节模块基础2022.08.14周日晚 2 #用于导入模块,import放在程序前面,且按照Python标准库模块、Python第三方模块、自定义模块的顺序从上到下排开 3 4 import os #内置模块放在最前面 5 import sys 6 # from Calc02 import mul #导入部分 7 # from Calc02 import * #导入模块下的所有,一般不推荐使用 8 from Calc02 import mul as m #导入的时候重命名模块 9 10 11 m(3,4) #上面导入的时候已经将Calc02模块下的mul函数重命名为m,所以用m() 12 # mul(3,4) #如果部分导入mul,那么也只能使用Calc02中的mul函数 13 # add(3,4) 14 # div(3,4)
二、模块导入
1、import语句:用于导入模块,import放在程序前面,且按照Python标准库模块、Python第三方模块、自定义模块顺序从上到下排开。语法如下:
import module 导入后,使用 模块名.函数名 引用
2、from import语句:常用于只导入指定模块的部分属性或模糊导入,语法如下:
from module import name1[,name2][,...nameN]
注意:不推荐使用:from module import *
使用as更换名称:from module import name1 as name2 通过这种方式引入的时候,调用函数只能给出函数名,不能给出模块名,但是当两个模块中含有相同名称函数的时候,后面一次引入会覆盖前一次引入。
三、模块导入执行顺序
1、找到模块文件:在模块搜索路径下搜索模块文件
程序的主目录
PYTHONPATH目录
标准链接库目录Lib
2、编译成字节码:文件导入时会编译,因此,顶层文件的.pyc字节码文件在内部使用后会丢弃,只有被导入的文件才会留下.pyc文件
3、导入import(或者重载reload)时,Python会立即执行模块文件的顶层程序代码(不再函数内的代码),而位于主函数内的代码直到函数被调用后才会执行,reload()用于重载加载模块。
1 #第三章模块导入规则及应用,该例子需要使用windows的cmd命令执行 2 import sys 3 4 for p in sys.path: #先打印所有路径 5 print(p) 6 sys.path.append('E:\Python_code\project01') #工作中遇到模块找不到的时候,通过sys.path.append('path')函数来导入自定义模块所在的目录,加上该模块后,去cmd切换到该路径下执行python Demo06就可成功了 7 8 import Test2 9 # print(sys.path) #包含了模块所有的搜索路径 10 Test2.pri()
备注:
1、如果不想如第三点那样执行导入模块的代码,常用解决方案是:在python模块中需要测试或者直接运行的代码前加
if(__name__=='__main__'):
2、通过sys.path.append(path)函数来导入自定义模块所在的目录
1 #模块导入规则及应用 2 def pri(): 3 print('hello') 4 5 6 if(__name__ == 'main'): #通过if(__name__ == 'main')可以避免该模块被其它导入(import或reload)时,而立即执行该模块的顶层程序代码 7 print('hello1') #程序顶层代码(第一行缩进的) 8 9 10 # print('hello1') #这是程序的顶层代码,顶层文件的.pyc字节码文件在内部使用后会被丢弃,只有被导入的文件才会留下.pyc文件 11 # print(__name__) #被自己模块调用时是__main__,被其它模块调用时会是其他模块的文件名