验证码: 看不清楚,换一张 查询 注册会员,免验证
  • {{ basic.site_slogan }}
  • 打开微信扫一扫,
    您还可以在这里找到我们哟

    关注我们

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

阅读:1308 来源:乙速云 作者:代码code

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())

      运行效果

      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__ == '__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'
    分享到:
    *特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: hlamps#outlook.com (#换成@)。
    相关文章
    {{ v.title }}
    {{ v.description||(cleanHtml(v.content)).substr(0,100)+'···' }}
    你可能感兴趣
    推荐阅读 更多>