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

背景:python

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

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

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

  BUT,Python可以经过os和sys解决这个问题。post

解决方案:spa

  思路:code

  假设有一个文件夹 apporm

  • 若 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  #供参考

  这样写就能够啦!不管是本地文件服务仍是项目服务,均可以正常地运行了。注意,因此涉及的相关组件都要这样哦!blog

相关文章
相关标签/搜索