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

 更新时间:2023年03月03日 08:33:19   作者: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'

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Python内置模块logging用法实例分析

    Python内置模块logging用法实例分析

    这篇文章主要介绍了Python内置模块logging用法,结合实例形式较为详细的分析了Python基于logging模块的日志配置、输出等常用操作技巧,需要的朋友可以参考下
    2018-02-02
  • 详解Django将秒转换为xx天xx时xx分

    详解Django将秒转换为xx天xx时xx分

    这篇文章主要介绍了Django将秒转换为xx天xx时xx分,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • python字典排序实例详解

    python字典排序实例详解

    这篇文章主要介绍了python字典排序实现方法,实例分析了Python字典排序的相关技巧,需要的朋友可以参考下
    2015-05-05
  • Selenium webdriver添加cookie实现过程详解

    Selenium webdriver添加cookie实现过程详解

    这篇文章主要介绍了Selenium webdriver添加cookie实现过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • Appium+python自动化怎么查看程序所占端口号和IP

    Appium+python自动化怎么查看程序所占端口号和IP

    这篇文章主要介绍了Appium+python自动化怎么查看程序所占端口号和IP,本文以FQ工具 Lantern 为例,通过图文并茂的形式给大家介绍的非常详细,需要的朋友可以参考下
    2019-06-06
  • 基于python SMTP实现自动发送邮件教程解析

    基于python SMTP实现自动发送邮件教程解析

    这篇文章主要介绍了基于python实现自动发送邮件教程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • pytorch锁死在dataloader(训练时卡死)

    pytorch锁死在dataloader(训练时卡死)

    这篇文章主要介绍了pytorch锁死在dataloader(训练时卡死),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-05-05
  • python 使用Yolact训练自己的数据集

    python 使用Yolact训练自己的数据集

    这篇文章主要介绍了python 使用Yolact训练自己的数据集,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下
    2021-04-04
  • python利用标准库如何获取本地IP示例详解

    python利用标准库如何获取本地IP示例详解

    这篇文章主要给大家介绍了关于python利用标准库如何获取本地IP的相关资料,文中先对python的标准库进行了简单的介绍,而后给大家详细介绍了关于python用标准库获取本地IP的实现方法,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2017-11-11
  • Python基础教程之Turtle绘制图形详解

    Python基础教程之Turtle绘制图形详解

    在Python中,绘图是一个非常有趣的领域,其中比较流行的绘图库就有 Turtle,所以本文就来讲讲如何在Python中使用它来创建和修改图形,需要的可以参考一下
    2023-06-06

最新评论