这篇文章主要介绍“Python多模块引用由此引发的相对路径混乱问题怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python多模块引用由此引发的相对路径混乱问题怎么解决”文章能帮助大家解决问题。
多模块引用由此引发的相对路径混乱
当不同层级的 Python 模块相互调用时,我们会发现原本在一个模块中写死的相对路径会导致找不到文件的报错。
这种问题该怎么解决呢?
先说结论
复制下面的代码, 放到你的模块内 (或者保存为一个 .py 文件), 调用
relpath函数即可.
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())
运行效果
特点
不到 10 行代码
无第三方库依赖
使用简单, 只需把原先写死的相对路径, 替换为 relpath({之前写的路径}) 即可
此外, Pycharm 还能够识别到文件参数, 在你键入时自动给出路径提示
更复杂的情况演示
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'