• 解决在项目中相对路径导入 与 绝对路径导入问题


    背景:

      在项目开发中,根据核心引擎架构开发组件功能,其中一部分功能要通过引擎实现,即用相对路径导入各个模块即可。

      但是在开发期间,遇到一个需求,需要一个本地文件跑其中的一部分服务。因此出现了各种模块导入的问题。一开始使用sys.path.append将文件的路径导入后,以正常import modulename的方式导入。但是如果这部分的服务又会在引擎中被某些服务调用,则会报错。

      最笨的解决方案是每个依赖文件写两个,/(ㄒoㄒ)/~~

      BUT,Python能够通过os和sys解决这个问题。

    解决方案:

      思路:

      假设有一个文件夹 app

    • 若 app 下有app/__init__.py文件,则此 app 被视作一个 package,而 app 下的其他文件/文件夹被视作 module
    • 我们知道,package 的意义是作为一个整体,提供某些功能。因此,package 内部的各个 module 之间使用相对路径导入
    • 比如:在 module1.py 内,这样相对导入:from .module2 import myClass2
    • 注意,问题来了,此时不能之间运行 module.py 这个文件,否则会报错:SystemError: Parent module '' not loaded, cannot perform relative import
    • 我们只能在package外,也就是文件夹 app 外的 run.py文件中导入:from app.module2 import myClass2
     
       代码实现:
    # add the model path to sys.path
    import sys
    import os
    
    current_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    ROOT_PATH = os.path.join(current_path, '..')
    sys.path.append(ROOT_PATH)
    # print(current_path)
    # print(ROOT_PATH)  # /Users/zoe/dcba/service/..
    from service.tms import tms  #供参考
    

      这样写就可以啦!无论是本地文件服务还是项目服务,都可以正常地运行了。注意,所以涉及的相关组件都要这样哦!

     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    拉格朗日乘子基本概念
    "模式识别与机器学习"读书笔记——2.3(2)
    [raw]人工智能方向调查
    Android !No Launcher activity found!错误
    [raw]ubuntu在当前目录右键打开终端
    Android, 读取大型文件报错
    Blueman Ubuntu的蓝牙管理器
    VMware下Ubuntu8.04 方向键失效的解决方法
    无线中间人攻击初探
    【经验】短接 Flash 解决二次量产金士顿 DTI G2 4GB U盘(群联PS225139)问题
  • 原文地址:https://www.cnblogs.com/zoe233/p/8193528.html
Copyright © 2020-2023  润新知