模块:
本质上就是以.py结尾的文件。 其目的就是为了文件里的代码实现一些功能
包:
就是包含有__init__.py文件的目录。 包和文件夹仅仅只差了这个文件
import 模块 导入的本质就是搜索路径把python文件解释一遍 所以导入模块就一定要找到路径
直接用import调用的是标准库模块,python自己内置的 。 import 会先在环境变量中找这个模块,然后执行一遍引用的模块。所以一般引用模
块 都是功能函数,没有逻辑运算和处理
rom 模块 import 函数 这个跟上面原理不同,它完全是把函数copy到了要导入的模块中(存在函数同名的情况,还是会执行执行本
身函数,非要执行导入的同名函数,可使用 from 模块 import 函数 as 别名 。执行别名函数就行)
直接在本身模块上用该函数就行。
from 包 import 包 导入包和导入模块是完全不同的概念和原理
导入包是执行包里面的__init__.py文件 导入模块是把模块里面的数据赋值一个变量,然后调用变量里的东西
普通导入模块或者里面方法
import module 在环境变量中找module文件路径,并执行一遍搜索到的模块
from module import m1 相当于把m1函数函数直接copy到当前模块中
from module import * 把module模块中的函数全部引入到当前模块 不建议用(易与当前模块重名)
from module import m1 as bie 把引入的函数换个变量名这样避开当前模块重名函数
模块和包平级,包里面模块导入包外和模块
import sys,os
x = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #从当前的文件向上两级目录的路径
sys.path.append(x) #把这个路径加入环境变量,就能找到需要导入函数路径了
import day10 #能找到模块了
day10.shoping()
外面包导入里面模块
from haha import number #用from把模块相当于抄写在当前模块中
number.test()
包里面模块导入另一个包模块
其实和上面是一样的,添加环境变量,导入模块即可
import sys,os
x = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(x)
from ha2 import goog2 #从ha2包中找到goog2模块
goog2.bb3()
导入包
import bao 其实就是解释包里面的__init__文件 没什么意义,我们一般都是要导入包里面模块
import sys,os #增加环境变量,才能找到博爱的路径
x = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(x)
import ha2 #导入包 其实就是执行__init__文件,如果要执行包里面的模块,只能在__init__中导入模块,且只能用(from导入)
init文件
print(‘这是init文件‘)
from . import goog2 #其实这里注意了 ,当我们导入一个模块的时候,导入的模块中还有导入模块操作时(1——》2,2——》3)在2中用import找3模块的话,1无法找到3模块(3路径没在环境变量中),可以在2中用from
#来导入模块,相当于copy3模块到2模块中,1模块当然能执行3模块的函数了
导入包,并且调用里面的模块
import sys,os
x = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(x)
import ha2
ha2.goog2.bb3()
导入不同级别目录模块
跨项目(包)来导入模块时:
由于当前处在不同的包内,当导入模块时,就会按它的环境变量sys.path(是一个列表)里面的路径去搜索导入模块文件。由于找不到
肯定会报错,所以我们要增加父包或者父父包(向上退2级或者3级)路径到环境变量中来使它能被找到导入。
__file__当前文件的路径 dir = os.path.abspath(__file__)当前文件的绝对路径 os.path.dirname(__file__) 当前文件的父目录
导入和优化
如果模块中的数据被重复调用很多次 那么每次调用的时候就会先找文件再去执行,重复去找的过程其实浪费很多资源。我们可以
用 from 模块 import 这种导入方式 ,把函数直接copy来直接用,而不用反复去找文件调用
关于在导入包时注意的事项
如果需要跨包调用模块,则是在调用成功包后,执行的是包下面的__init__文件,需要在此文件中引用需要导入的模块,但是由于__init__的特殊,
此文件导入必须以from . import 模块 的形式来导入
原来需要导入的模块调用时应该是 调用的包名字.模块名.函数
第三方模块 自己安装
自定义模块 自己编辑
原文:https://www.cnblogs.com/huangjianfir/p/13227215.html