解決在項目中相對路徑導入 與 絕對路徑導入問題

背景: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

相關文章
相關標籤/搜索