2014-02-17 117 views
1

讓我解釋的問題 - 我們有這樣的項目:如何在Python中加載與其他模塊名稱相同的模塊?

model/__init__.py 
model/abstract.py 
task/__init__.py 
task/model.py 

如何裝入task/model.pymodel.abstract什麼是它的語法?

# task/model.py 
import model # it loads task/model.py not model 
from model.abstract import test # there is no test exception 
# model/abstract.py 
test = 1 

如何做這樣的進口?


請求更多詳細信息。

谷歌App Engine應用程序: - 主要是main.py

目錄結構:

└───src 
    │ app.yaml 
    │ index.yaml 
    │ main.html 
    │ main.py 
    │ task_master_api.py 
    │ 
    ├───circle 
    │  model.py 
    │  __init__.py 
    │ 
    ├───model 
    │  abstract.py 
    │  xxx.py 
    │  __init__.py 
    │ 
    ├───task 
    │  model.py 
    │  __init__.py 
    │ 
    ├───user 
    │  model.py 
    │  __init__.py 

異常(見task.model根不模型):

from .. import model  
logging.critical((type(model), model.__name__)) 

from model.abstract import AbstractNamed, AbstractForgetable 

-

CRITICAL 2014-02-17 21:23:36,828 model.py:8] (<type 'module'>, 'task.model') 

    from model.abstract import AbstractNamed, AbstractForgetable 

ImportError: No module named abstract 

更多相關答案。

from .. import model 

給出例外。

ValueError: Attempted relative import beyond toplevel package 
+0

您是否將'model.py'作爲腳本運行? – BrenBarn

+0

不是 - 'model.py'被導入另一個帶有'main'的模塊。 – Chameleon

回答

0

雖然ndpu的答案相對應的進口工作,這個問題的答案是在我心中燃燒很簡單:更改文件的名稱,以避免這個錯誤

如果你有model.py在圓形目錄裏面,怎麼把名字改成circle_model.py

然後,您應該能夠導入模塊,而無需任何相關導入..業務。

編輯 - 現在知道你不想重命名

確保您有一個__init__.py文件在你的src目錄下,然後嘗試相對進口​​

+0

我知道解決方法,但想知道如何不使用解決方法。 – Chameleon

+0

在'src'中試過'__init __。py''' =沒有''''的模塊'''ValueError:試圖相對導入超出頂層包' – Chameleon

0
在其他給定

相對進口答案應該正常工作。但它不起作用,因爲你有名字衝突。你有一個名爲model的包和模塊。嘗試爲您的包或模塊使用其他名稱。

+0

python是否限制你不能使用'name'模塊在帶有'name'的模塊中 - 它確實存在嗎? – Chameleon

0

我發現了兩個技巧來迫使負載MODELE name到模塊name

首先迫使只有絕對的裝載:

from __future__ import absolute_import 
import name 

二是像以前的,但更多的代碼和更多的本地影響:

save_path = sys.path[:] 
sys.path.remove('') 
import name 
sys.path = save_path 
+0

感謝您的建議,幫助人們! – Chameleon

相關問題