其實也是在寫本身項目的時候遇到的,之前也遇到了可是一直採起的是迴避的策略,此次總算弄清楚因此總結一下。python
這個項目的頂級目錄是medivac,他自己是一個python模塊。flask
熟悉flask的人都知道,在寫一個flask項目的時候,咱們經常將一個模塊的app初始化放在根目錄的__init__.py文件中。app
而後能夠很方便的把其它須要路由的模塊都引入到這個__init__.py中達到自動加載而且路由的效果。socket
另外也可使用一個叫作flask藍圖的東西(blueprint),將模塊細分。函數
若是是在__init__.py初始化了app(就暫時理解成app=Flask(__name__)),name在views中咱們創建一個叫hello的文件,而且寫一個函數路由他像這樣網站
from medivac import app @app.route("/") def hello(): return "let's move!"
會爆出這樣的錯誤spa
from medivac import app ImportError: No module named medivac
爲何會找不到medivac模塊?咱們都知道在導入該模塊下面__init__.py東西的時候直接寫該模塊名字就能夠,由於__init__.py默認會運行加載。若是使用IDE會發現代碼毫無問題,也能夠正常跳轉。線程
後來發現並不能這麼寫,必需要medivac上面還有文件夾包住的時候,這樣的尋址才能夠。在python看來,他看不到這個根目錄,他認爲項目目錄是code
medivac/ 而不是 /medivac/blog
因此若是改爲這樣
from __init__ import app
就能夠正常運行了。
可是我以爲這樣坑蠻多的,新建一個.py文件來初始化app,而後使用藍圖來路由也是不錯的選擇。
特別注意,還有一個嚴重影響模塊尋址的環境變量PYTHONPATH,將當前環境變量的PYTHONPATH設置成對應的地址,能夠方便的幫助絕對尋址。
另外順便提一點,關於uwsgi的配置
[uwsgi] # uwsgi 啓動時所使用的地址與端口 socket = 127.0.0.1:8001 # 指向網站目錄 chdir = /home/medivac/project/medivac # python 程序內用以啓動的 application 變量名 module = app callable = app master = True # 處理器數 processes = 1 # 線程數 threads = 1 # 工做進程 workers = 1
當指定的chdir是/home/medivac/project/medivac的時候那麼module表明的是去哪一個文件裏找callable 這個app來進行加載。
Reference:
http://stackoverflow.com/questions/11536764/how-to-fix-attempted-relative-import-in-non-package-even-with-init-py