import 用法
导入方式
import用来导入其他模块,从而达到代码复用的目的。但是import真的还是很多坑的,如果摸不到门道用起来还是很头疼的,首先我们来说一下它的用法
- import module_name
- from Packagename import module_name
这两种方法同曲异工,都是从两个地方去寻找包,第一个是sys.path[可import sys,print (sys.path)]查看,一般也就是python的安装路径下,我们平时pip install的第三方包都可使用import直接导入,第二个是文件的执行目录,也就是os.path路径下进行寻找。
案例分析
- 目录结构
|---------parent
|-----m1.py
|-----m2.py
|-----son(文件夹)
|–m3.py
|–m4.py
首先,新建文件夹parent,在文件夹下新建m1.py,m2.py,文件夹下新建son文件夹,然后新建m3.py和m4.py
m1.py中添加内容
import m2
m2.print_m()
m2.py中添加内容
def print_m():
print ("m2")
运行m1.py,运行我们知道肯定是没问题的,因为m1所在的目录下也有m2.py
那么问题来了,我们在m3.py中添加内容
import m4
m4.print_m4()
m4.py中添加内容:
def print_m4():
print ("m4")
这时候我们修改m1.py为
import m2
from son import m3
m2.print_m()
这时候运行m1.py就会报错,提示无法导入m4,这是为什么呢,原因其实很简单,我们可以捋一下这个流程,m1中使用from son import m3,这是没有问题的,但是m3中import m4这就会报错,因为我们导入方式中两种方式(sys.path和os path)中m4既不在sys.path中也不在我们m1所在的目录,这就引入了我们非常重要的两个概念,相对路径和绝对路径,在python3中我们的路径读取都是绝对导入(对于sys.path和os path而言)所以报错,所以我们的m3.py需要进行修改为相对路径(这样就变相的把os path添加了)
from . import m4
#.的意思就是获取当前文件所在的目录,也算一种绝对导入了
m4.print_m4()
常用的相对路径有:
from . import module_name #导入和自己同目录的模块
from .package import module #导入和自己同目录的包的模块
from .. import module_name
其实我们在进行相对导入的时候也会碰到很多坑
比如我们把m2.py添加一个函数,然后在m3.py中引用
from .. import m3
这时候我们运行m1.py就会报错,因为这里的…所在的目录是parent比m1的层级更高,所以会报错
ValueError: attempted relative import beyond top-level package
PS:所以我们平时开发python代码的时候我们尽量都是使用path绝对路径这样层级也比较清楚,不会出现问题