开发者

Python多模块引用由此引发的相对路径混乱问题

开发者 https://www.devze.com 2023-03-04 09:16 出处:网络 作者: Likianta
目录多模块引用由此引发的相对路径混乱先说结论运行效果特点更复杂的情况演示总结多模块引用由此引发的相对路径混乱
目录
  • 多模块引用由此引发的相对路径混乱
    • 先说结论
    • 运行效果
    • 特点
    • 更复杂的情况演示
  • 总结

    多模块引用由此引发的相对路径混乱

    当不同层级的 python 模块相互调用时,我们会发现原本在一个模块中写死的相对路径会导致找不到文件的报错。

    这种问题该怎么解决呢?

    先说结论

    复制下面的代码, 放到你的模块内 (或者保存为一个 .py 文件), 调用 relpath 函数即可.

    def relpath(file):
        """ Always locate to the correct relative path. """
        from sys import _getframe
        from pathlib import Path
        frame = _getpythonframe(1)
        curr_file = Path(frame.f_code.co_filename)
        return str(curr_file.parent.joinpath(file).resolve())
    

    运行效果

    Python多模块引用由此引发的相对路径混乱问题

    特点

    • 不到 10 行代码
    • 无第三方库依赖
    • 使用简单, 只需把原先写死的相对路径, 替换为 relpath({之前写的路径}) 即可
    • 此外, Pycharm 还能够识别到文件参数, 在你键入时自动给出路径提示

    Python多模块引用由此引发的相对路径混乱问题

    更复杂的情况演示

    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__ == '__mwww.devze.comain__':
        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()  # -> python'/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'
    
    

    总结

    以上为开发者_Python学习个人经验,希望能给大家一个参考,也希望大家多多支持我们。

    0

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    关注公众号