2011-10-05 78 views
4

我有一個項目中,目錄結構如下:有人可以解釋這個奇怪的Python/Django導入行爲嗎?

mywebsite/ 
    manage.py 
    __init__.py 
    myapp/ 
     models/ 
      __init__.py 
      base.py 

的myapp /模型/ base.py包含:

class X(object): 
    pass 

的myapp /模型/ __ init__.py包含:

from base import X 

現在,如果我做manage.py shell我可以有以下會話:

> import mywebsite.myapp.models 
> import myapp.models 
> mywebsite.myapp.models.X == myapp.models.X 
False 

但是,如果我改變的myapp /模型/ __ init__.py是:

from myapp.models.base import X 

然後我得到真正的預期。

我想我缺少一些關於導入如何工作或Django在使用manage.py shell時如何更改路徑的信息。

任何人都可以解釋這一點嗎?

+0

Daniel Roseman - 你說這與Django無關。但是,如果我啓動一個普通的python會話(同時CDed入mywebsite)並導入mywebsite,那麼我會得到一個預期的導入錯誤。我懷疑Django正在做一些我不明白的路徑,當我使用manage.py shell – ColinHowe

回答

4

當您打開Django shell時,它會將項目的路徑添加到sys.path。你可以在Django shell和普通的python shell上運行import sys; print sys.path來比較輸出。您會注意到,Django shell的輸出包含mywebsite目錄的路徑作爲列表的第一項。

基本上,這意味着這兩個導入會創建兩個不同的模塊對象,因爲它們是從different points in the search path獲得的。比較檢查返回False,因爲模塊對象具有不同的ID(內存地址)

# These two values will be different 
id(mywebsite.myapp.models) 
id(myapp.models) 
+0

謝謝!非常有意義 - 我想我一直盯着(並且大喊)這麼久:D – ColinHowe

+0

不客氣。 –

相關問題