關於python項目路徑導入本身寫的庫出錯的一點思考

其實也是在寫本身項目的時候遇到的,之前也遇到了可是一直採起的是迴避的策略,此次總算弄清楚因此總結一下。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

相關文章
相關標籤/搜索