python如何使用import引入其他目錄文件或自定義模塊
問(wèn)題描述
在python工程中,常常需要使用import引入自己編寫的其他模塊,但其它模塊有時(shí)不在同一個(gè)文件夾下。
此時(shí)直接import會(huì)導(dǎo)致找不到包而報(bào)錯(cuò)
ModuleNotFoundError: No module named '****'
下面提供2種解決方案。
解決方案
以下面的項(xiàng)目結(jié)構(gòu)為例進(jìn)行說(shuō)明。
方案1:使用相對(duì)路徑(局限)
在import時(shí)直接使用相對(duì)路徑
.
代表當(dāng)前文件所在路徑..
代表當(dāng)前文件的父目錄...
代表爺爺目錄,以此類推,每多一個(gè)點(diǎn),就向上翻一層目錄。
例1,在f1.py
中寫:
from ..p2 import f2.py
例2,在t1.py
中寫:
from ..b import t2.py
這樣寫能否執(zhí)行成功,取決于主函數(shù)入口(即你執(zhí)行的文件)!記住這個(gè)原則(局限):
相對(duì)路徑所涉及的目錄范圍內(nèi)不允許有主函數(shù)入口
不滿足這個(gè)原則時(shí),報(bào)錯(cuò)
ValueError: attempted relative import beyond top-level package
在上面的項(xiàng)目結(jié)構(gòu)中,如果我們執(zhí)行python main.py
,那么在main.py
中引入t1.py
會(huì)報(bào)錯(cuò),
原因是t1.py
中使用相對(duì)引入時(shí),..
回退到的目錄是項(xiàng)目主目錄,也就是main.py
所在的目錄,違反了該原則。
但在main.py
中引入f1.py
是正確的,因?yàn)?code>f1.py在使用相對(duì)路徑引入時(shí)最多回退到pkg
文件夾,不會(huì)影響main.py
的執(zhí)行。
方案2:絕對(duì)路徑引入(推薦)
1. 在main.py中調(diào)用t1.py
這個(gè)很常規(guī),直接在main.py
使用import
即可
form a.t1 import *
2. 在t1.py中調(diào)用main.py
在t1.py
中寫:
import sys from pathlib import Path sys.path.append(str(Path(__file__).resolve().parents[1])) # 將父級(jí)目錄加入執(zhí)行目錄列表 from main import * # 由于main.py所在目錄已加入到sys.path,可直接引入
代碼中parents
返回一個(gè)列表,parents[0]
代表該文件所在目錄,下標(biāo)每加一,目錄向上一層,所以這里parents[1]
得到的是父目錄。
3. 幾個(gè)坑
1. os.getcwd()
- 這個(gè)函數(shù)獲取的始終是當(dāng)前終端所在目錄。
- 例如我的終端現(xiàn)在處在
/home/code/
下,執(zhí)行python a/1.py
,文件1.py
中的語(yǔ)句os.getcwd()
返回值為/home/code/
。
2. __file__
- 當(dāng)前文件相對(duì)于終端的路徑。
- 例如我的終端現(xiàn)在處在
/home/code/
下,執(zhí)行python a/1.py
,文件1.py
中的語(yǔ)句__file__
返回值為a/1.py
。 - 使用
os.path.abspath(__file__)
可獲得該文件的絕對(duì)路徑/home/code/a/1.py
。 - Tips:拼接路徑
os.getcwd()
/__file__
就是該文件的完整絕對(duì)路徑。
3. sys.path[0]
- 直接運(yùn)行py文件,即
python xxx.py
時(shí),為執(zhí)行文件所在的絕對(duì)目錄(不管終端處于什么路徑)。 - 需要注意,若執(zhí)行
python 1.py
,而1.py
中又import了其他目錄的2.py
,那么2.py
的sys.path[0]
與1.py
中相等,也就是說(shuō)在import其他文件時(shí),其他文件的sys.path[0]
將以當(dāng)前被執(zhí)行的文件為準(zhǔn)。 - 以模塊運(yùn)行時(shí),即
python -m xxx
時(shí),為終端所在絕對(duì)目錄,等于os.getcwd()
。
4. 小結(jié)
- 在
.py
文件中,使用__file__
最保險(xiǎn)。 - 但是在
.ipynb
文件中不存在__file__
變量,怎么辦? - 由于
.ipynb
文件一般不考慮被其他文件import
,因此直接使用sys.path[0]
取得文件所在目錄即可。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python使用matplotlib實(shí)現(xiàn)繪制自定義圖形功能示例
這篇文章主要介紹了Python使用matplotlib實(shí)現(xiàn)繪制自定義圖形功能,結(jié)合實(shí)例形式分析了Python基于matplotlib模塊實(shí)現(xiàn)自定義圖形繪制相關(guān)操作技巧,需要的朋友可以參考下2018-01-01詳解利用OpenCV提取圖像中的矩形區(qū)域(PPT屏幕等)
這篇文章主要介紹了詳解利用OpenCV提取圖像中的矩形區(qū)域(PPT屏幕等),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-07-07win32com操作word之Application&Documents接口學(xué)習(xí)
這篇文章主要為大家介紹了win32com操作word之Application&Documents接口學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01numpy.ndarray 交換多維數(shù)組(矩陣)的行/列方法
今天小編就為大家分享一篇numpy.ndarray 交換多維數(shù)組(矩陣)的行/列方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08Numpy中np.max的用法及np.maximum區(qū)別
這篇文章主要介紹了Numpy中np.max的用法及np.maximum區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11Python KeyError異常的原因及問(wèn)題解決
KeyError是Python內(nèi)置異常之一,KeyError是當(dāng)試圖獲取字典中不存在的鍵時(shí),引發(fā)的異常,本文就來(lái)介紹一下KeyError異常的原因及問(wèn)題解決,感興趣的可以了解一下2024-12-12