首頁 >後端開發 >Python教學 >Python中import導入上一層目錄模組及循環import問題

Python中import導入上一層目錄模組及循環import問題

高洛峰
高洛峰原創
2017-03-03 15:20:442002瀏覽

import上一級目錄的模組

python中,import module會去sys.path搜尋,sys.path是個列表,而且我們可以動態修改。
要import某個目錄的module,我們sys.path.insert(0,somedir)來加入搜尋路徑,就可以import了。
既然這樣,要import上一級目錄的module,可以sys.path.insert(0,parentdir)。
不過這種寫絕對路徑的方式,如果檔案放到其它地方,就不行了。
所以用動態方法來取得上一層目錄。

import os,sys 
parentdir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 
sys.path.insert(0,parentdir)

為什麼用sys.path.insert(0,parentdir) 而不是用sys.path.append(parentdir)呢
因為是遍歷搜尋路徑的,所以如果在其它路徑裡也有個同名的module,會import錯。用sys.path.insert(0,parentdir)可以確保先搜尋這個路徑。

解決循環import的問題
在python中常常會遇到循環import即circular import的問題。
現實中常出現這種滑稽的情況,
安裝無線網卡的時候,需要上網下載網卡驅動..
安裝壓縮軟體的時候,從網路下載的壓縮軟體安裝程式居然是被壓縮了的..
循環依賴就類似於這種情況。
舉個栗子,
在models.py中,

from server import db 
class User(db.Model): 
  pass

在server.py中,

from flask import Flask 
from flask.ext.sqlalchemy import SQLAlchemy 
app = Flask(__name__) 
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db' 
db = SQLAlchemy(app) 
from models import User

這樣就產生了循環import的問題。
解決循環import的方法主要有幾種。
1.延遲導入(lazy import)
即把import語句寫在方法或函數裡面,將它的作用域限制在局部。
這種方法的缺點就是會有效能問題。
2.將from xxx import yyy改成import xxx;xxx.yyy來存取的形式
3.組織代碼
出現循環import的問題往往意味著程式碼的佈局有問題。
可以合併或分離競爭資源。
合併的話就是都寫到一個檔案裡面去。
分離的話就是把需要import的資源提取到一個第三方檔案去。
總之就是將迴圈變成單向。

更多Python中import導入上一層目錄模組及循環import問題相關文章請關注PHP中文網!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn