Python多模块引用由此引发的相对路径混乱问题
作者:Likianta Me
这篇文章主要介绍了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'
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。