python导包路径问题_python的导包问题
有事会遇到在python代码中导⼊包错误问题,本⽂简单对python包的引⼊做简单介绍
简单说,我认为python导包⼀共有3种情况,分别是:
要导的包与当前⽂件在同⼀层
要导的包在当前⽂件的底层(就是与当前⽂件夹同级的⽂件夹⾥)
要导的包在当前⽂件的上层
1、要导的包与当前⽂件在同⼀层
use.py
source.py
use.py表⽰包的调⽤⽅,source.py则是被调⽤⽅(下⾯的⼏种情况同)
这种情况下直接from ⽂件名 import 函数/类/变量 就⾏了
如 from source import Source
运⾏use.py 会成功输出success
要导的包在当前⽂件的底层
新建⼀个wrap⽂件夹,把source.py放进去
这时use.py导⼊source.py应该是
from wrap.source import Source
如果⾥⾯有多层结构,多⽤⼏个点就能解决了
要导的包在当前⽂件的上层
这种情况是最复杂的⼀种,我们把上⾯那种情况的source.py和wrap.py换个位置
现在use.py在wrap⽂件夹⾥⾯了,⽽source.py跑到wrap⽂件夹外⾯了
现在use.py要调⽤source.py应该怎么样调⽤呢
这时候就需要把⽂件根⽬录放⼊,python包的搜索路径⾥⾯。
⼤家想⼀想我们调⽤pip下来的包或者模块的时候,从来都不需要指定什么路径吧,直接使⽤包名或者模块名就能使⽤了,⽐如 import os。
这正是因为pip下来的包或模块所在的⽂件夹处于python默认的搜索路径⾥⾯。py⽂件import⽂件的时候,先在当前⽬录,不到就去python的搜索路径⾥,因此我们只需要把当前⼯程的根⽬录放⼊python的搜索路径就可以了。
具体操作如下:
在导⼊我们想导⼊的包之前,把当前项⽬的根⽬录放⼊python的搜索路径种,这样就能成功导⼊了。
os.path.dirname(file)
这句的代码的意思是:获取当前⽂件所在⽬录的相对路径,当前⽂件所在⽂件夹的相对路径就是 **.**了。
os.path.abspath(os.path.dirname(file))
这句代码的意思是把上⾯获取的相对路径变成绝对路径,我这⾥是D:\test\wrap,也就是use.py所在⽂件夹的绝对路径。
os.path.dirname( os.path.abspath(os.path.dirname(file)))
python默认安装路径这句代码的意思是获取上⾯所得到的路径的上⼀级路径,我这⾥就得到了D:\test,这个也是我的项⽬的根路径。
sys.path.insert(0,BASE_DIR)
这句代码表⽰把BASE_DIR写⼊到python搜索路径⾥。
以上写法并⾮固定,⼤家根据⾃⼰的⽂件夹结构来写
这样我的D:\test这个路径就加⼊到python搜索路径中了。
现在我导⼊Source,只需要这样写 from source import Source,因为source在D:\test⽬录下,所以能搜索到,同理D:\test的⼦⽂件夹⾥的⽂件导⼊⽅式就可以写出 from wrap.source import Source,注意从插⼊的根路径开始写路径就⾏了