有事會遇到在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)))
這句代碼的意思是獲取上面所得到的路徑的上一級路徑,我這里就得到了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,注意從插入的根路徑開始寫路徑就行了