Python多模塊引用由此引發(fā)的相對(duì)路徑混亂問(wèn)題
多模塊引用由此引發(fā)的相對(duì)路徑混亂
當(dāng)不同層級(jí)的 Python 模塊相互調(diào)用時(shí),我們會(huì)發(fā)現(xiàn)原本在一個(gè)模塊中寫(xiě)死的相對(duì)路徑會(huì)導(dǎo)致找不到文件的報(bào)錯(cuò)。
這種問(wèn)題該怎么解決呢?
先說(shuō)結(jié)論
復(fù)制下面的代碼, 放到你的模塊內(nèi) (或者保存為一個(gè) .py 文件), 調(diào)用 relpath
函數(shù)即可.
def relpath(file): """ Always locate to the correct relative path. """ from sys import _getframe from pathlib import Path frame = _getframe(1) curr_file = Path(frame.f_code.co_filename) return str(curr_file.parent.joinpath(file).resolve())
運(yùn)行效果
特點(diǎn)
- 不到 10 行代碼
- 無(wú)第三方庫(kù)依賴(lài)
- 使用簡(jiǎn)單, 只需把原先寫(xiě)死的相對(duì)路徑, 替換為 relpath({之前寫(xiě)的路徑}) 即可
- 此外, Pycharm 還能夠識(shí)別到文件參數(shù), 在你鍵入時(shí)自動(dòng)給出路徑提示
更復(fù)雜的情況演示
someprj |- relpath.py |- A |- a.py |- AA |- aa.py |- AAA |- aaa.py |- B |- b.txt
# A/a.py def show_path(): from relpath import relpath print(relpath('../B/b.txt')) if __name__ == '__main__': from A.AA import aa from A.AA.AAA import aaa show_path() # -> '/someprj/B/b.txt' aa.show_path() # -> '/someprj/B/b.txt' aaa.show_path() # -> '/someprj/B/b.txt' # A/AA/aa.py def show_path(): from relpath import relpath print(relpath('../../B/b.txt')) if __name__ == '__main__': from A import a from A.AA.AAA import aaa show_path() # -> '/someprj/B/b.txt' a.show_path() # -> '/someprj/B/b.txt' aaa.show_path() # -> '/someprj/B/b.txt' # A/AA/AAA/aaa.py def show_path(): from relpath import relpath print(relpath('../../../B/b.txt')) if __name__ == '__main__': from A import a from A.AA import aa show_path() # -> '/someprj/B/b.txt' a.show_path() # -> '/someprj/B/b.txt' aa.show_path() # -> '/someprj/B/b.txt'
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python中raise用法簡(jiǎn)單實(shí)例(超級(jí)詳細(xì),看了無(wú)師自通)
python中raise語(yǔ)句用于手動(dòng)觸發(fā)異常,通過(guò)raise語(yǔ)句可以在代碼中顯式地引發(fā)異常,從而使程序進(jìn)入異常處理流程,下面這篇文章主要給大家介紹了關(guān)于Python中raise用法的相關(guān)資料,需要的朋友可以參考下2024-03-03使用Python獲取當(dāng)前工作目錄和執(zhí)行命令的位置
這篇文章主要介紹了使用Python獲取當(dāng)前工作目錄和執(zhí)行命令的位置,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03pytest官方文檔解讀fixtures的調(diào)用方式
這篇文章主要為大家介紹了pytest官方文檔解讀fixtures的調(diào)用方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06python用opencv完成圖像分割并進(jìn)行目標(biāo)物的提取
這篇文章主要介紹了python用opencv完成圖像分割并進(jìn)行目標(biāo)物的提取,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05基于python實(shí)現(xiàn)ROC曲線(xiàn)繪制廣場(chǎng)解析
這篇文章主要介紹了基于python實(shí)現(xiàn)ROC曲線(xiàn)繪制廣場(chǎng)解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06解決項(xiàng)目pycharm能運(yùn)行,在終端卻無(wú)法運(yùn)行的問(wèn)題
今天小編就為大家分享一篇解決項(xiàng)目pycharm能運(yùn)行,在終端卻無(wú)法運(yùn)行的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01