Python多模塊引用由此引發(fā)的相對路徑混亂問題
多模塊引用由此引發(fā)的相對路徑混亂
當(dāng)不同層級的 Python 模塊相互調(diào)用時(shí),我們會發(fā)現(xiàn)原本在一個(gè)模塊中寫死的相對路徑會導(dǎo)致找不到文件的報(bào)錯(cuò)。
這種問題該怎么解決呢?
先說結(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 行代碼
- 無第三方庫依賴
- 使用簡單, 只需把原先寫死的相對路徑, 替換為 relpath({之前寫的路徑}) 即可
- 此外, Pycharm 還能夠識別到文件參數(shù), 在你鍵入時(shí)自動給出路徑提示

更復(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內(nèi)置模塊logging用法實(shí)例分析
這篇文章主要介紹了Python內(nèi)置模塊logging用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Python基于logging模塊的日志配置、輸出等常用操作技巧,需要的朋友可以參考下2018-02-02
詳解Django將秒轉(zhuǎn)換為xx天xx時(shí)xx分
這篇文章主要介紹了Django將秒轉(zhuǎn)換為xx天xx時(shí)xx分,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09
Selenium webdriver添加cookie實(shí)現(xiàn)過程詳解
Appium+python自動化怎么查看程序所占端口號和IP
基于python SMTP實(shí)現(xiàn)自動發(fā)送郵件教程解析
pytorch鎖死在dataloader(訓(xùn)練時(shí)卡死)
python 使用Yolact訓(xùn)練自己的數(shù)據(jù)集
python利用標(biāo)準(zhǔn)庫如何獲取本地IP示例詳解

