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'

总结

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

(0)

相关推荐

  • 对python当中不在本路径的py文件的引用详解

    众所周知,如果py文件不在当前路径,那么就不能import,因此,本文介绍如下两种有效的方法: 方法1: 修改环境变量,在~/.bashrc里面进行修改,然后source ~/.bashrc 方法2: 引入.pth文件 在site-packages添加一个路径文件,如mypkpath.pth,必须以.pth为后缀,写上你要加入的模块文件所在的目录名称就是了. 1 windows c:\python27\site-packages # 我们的学员把pth文件直接放在c:\python27 # (或

  • Python引用模块和查找模块路径

    模块间相互独立相互引用是任何一种编程语言的基础能力.对于"模块"这个词在各种编程语言中或许是不同的,但我们可以简单认为一个程序文件是一个模块,文件里包含了类或者方法的定义.对于编译型的语言,比如C#中的一个.cs文件,Java中的一个.java或者编译后的.class文件可以认为是一个模块(但常常不表述为模块):对于解释型的语言会更加直观些,比如PHP的.php文件,在Python中就是.py文件可以认为是一个模块.在"模块"之上有"包",主要是

  • python实现引用其他路径包里面的模块

    问题:一个文件夹c下的模块test要引用另一个包b里面模块test2的函数add,如下图 解决办法: 经过前辈oyljerry等的指点迷津,要在sys.path添加包a的路径,永久添加则在/usr/lib/python2.7/dist-packages添加一个pth文件.如临时添加测试,可以使用列表函数append把该路径放入列表尾部即可. 为什么不是包b的路径呢?因为虽然a和b都是一个包,如添加包b的路径到搜索路径列表,则python搜索时先遇到a把它当作包处理,就不往里面寻找,导致包b没找到

  • 深入解析python项目引用运行路径

    目录 python项目引用运行路径的问题 获得当前文件的绝对路径 获取父文件目录 获取当前文件相对于 ROOT 的相对路径 如何将run/tools/main文件的运行路径改为run/ 补充:Python引用路径 python项目引用运行路径的问题 获得当前文件的绝对路径 Path(file).resolve() 是使用 pathlib 库获取当前 Python 脚本的绝对路径的方法.这里的 file 是一个内置变量,表示当前脚本的文件名.Path(file) 将这个文件名转换为一个 Path

  • Python常用模块os.path之文件及路径操作方法

    以下是 os.path 模块的几种常用方法: 方法 说明 os.path.abspath(path) 返回绝对路径 os.path.basename(path) 返回文件名 os.path.commonprefix(list) 返回list(多个路径)中,所有path共有的最长的路径 os.path.dirname(path) 返回文件路径 os.path.exists(path) 如果路径 path 存在,返回 True:如果路径 path 不存在,返回 False. os.path.lexi

  • 对python csv模块配置分隔符和引用符详解

    如下所示: file = open('./abc.csv') csv.reader(file, delimiter=',', quotechar='"') 说明:delimiter是分隔符,quotechar是引用符,当一段话中出现分隔符的时候,用引用符将这句话括起来,就能排除歧义. 以上这篇对python csv模块配置分隔符和引用符详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • python导入模块交叉引用的方法

    实际项目中遇到python模块相互引用问题,查资料,终于算是弄明白了. 首先交叉引用或是相互引用,实际上就是导入循环,关于导入循环的详细说明,可见我摘自<python核心编程>第二版的摘抄:Python导入循环方法. 附录给了一种解决交叉引用的方法,试了,不行,但关于交叉引用问题本身说明的很清楚,如果不清楚什么是交叉引用,可看附录一. 循环引用在python圈关注的并不多,语言上没有提供防止循环依赖的机制. 总的来说,应该在总体结构上避免模块之间互相依赖,即:A依赖B,B就不要依赖A,这也是代

  • Python代码中引用已经写好的模块、方法的两种方式

    平时写的一些 Python 的代码,需要在其他模块里面复用.最粗狂的方法就是直接 copy 过去. 但这种方式太麻烦,copy 一堆代码,导致代码量也很多.copy 的也不爽. 下面就介绍两种方式,可以简洁明了地调用自己在其他模块写的代码. 个人推荐第二种方式. 方式一: 手动使用 sys 调用自己写的 Python 模块.方法 我的代码存在 E:\\PycharmProjects\\111 目录下.需要调用的代码是 mypy 下 my007.py 里的 funA() 方法. my007.py

  • 详解Python模块化--模块(Modules)和包(Packages)

    目录 引言 Python Modules模块 导入模块 ①导入整个模块 ②导入模块中的特定函数 ③导入模块中的所有函数 给导入的模块一个别名 单独运行模块 加速模块加载 Python Packages包 引用包(Package)中的模块 引用包(Package)中子模块的函数或变量 利用相对路径引用包和模块 利用__all__提供包的显式索引 打包自己的Package并分发 安装python社区中的Package 总结 引言 在刚入门python时,模块化编程.模块.类库等术语常常并不容易理清.

  • Python Queue模块详细介绍及实例

    Python Queue模块 Python中,队列是线程间最常用的交换数据的形式.Queue模块是提供队列操作的模块,虽然简单易用,但是不小心的话,还是会出现一些意外. 创建一个"队列"对象 import Queue q = Queue.Queue(maxsize = 10) Queue.Queue类即是一个队列的同步实现.队列长度可为无限或者有限.可通过Queue的构造函数的可选参数maxsize来设定队列长度.如果maxsize小于1就表示队列长度无限. 将一个值放入队列中 q.p

  • Python Queue模块详解

    Python中,队列是线程间最常用的交换数据的形式.Queue模块是提供队列操作的模块,虽然简单易用,但是不小心的话,还是会出现一些意外. 创建一个"队列"对象 import Queue q = Queue.Queue(maxsize = 10) Queue.Queue类即是一个队列的同步实现.队列长度可为无限或者有限.可通过Queue的构造函数的可选参数maxsize来设定队列长度.如果maxsize小于1就表示队列长度无限. 将一个值放入队列中 q.put(10) 调用队列对象的p

  • python日志模块logbook使用方法

    python自带了日志模块logging,可以用来记录程序运行过程中的日志信息.同时python还有logbook模块用来取代logging模块,在很多的项目中logbook模块使用也是比较的多,因此本文介绍一下python logbook模块的使用方法. 1,安装 pip install logbook 官方的使用文档,这里 2,使用方法如下: 文件 logconf.py 初始化日志以及设置日志格式等参数: import sys import os import logbook import

  • Python常用模块sys,os,time,random功能与用法实例分析

    本文实例讲述了Python常用模块sys,os,time,random功能与用法.分享给大家供大家参考,具体如下: sys: 介绍:主要包含涉及python编译器与系统交互的函数. 常用函数: import sys print(sys.argv)#本文件名,已经运行该程序时的参数 #[如在命令窗口中python3 mysys.py 参数1 参数2] #那么参数1为sys.argv[1],以此类推 print(sys.version)#python版本号 print(sys.path)#返回模块的

  • python随机模块random使用方法详解

    random随机模块包括返回随机数的函数,可以用于模拟或者任何产生随机输出的程序. 一.random模块常用函数介绍 random.random() - 生成一个从0.0(包含)到 1.0(不包含)之间的随机浮点数: random.uniform(a, b) - 生成一个范围为 a≤N≤b 的随机数,随机数类型是浮点数: random.randint(a, b) - 生成一个范围为 a≤N≤b 的随机数,随机数的类型是整形,注意与random.uniform(a, b)区别: random.ra

随机推荐