2015-06-20 148 views
0

經過很長時間,我離開了我在Django中編寫的一個應用程序並沒有完成,我已經在新的Mac上回過頭來了。django dev on mac必須明確指定完整路徑

我很努力地讓代碼引用應用程序及其中的文件,而沒有顯式路徑。例如:

from myproject.app.file import object 

雖然我記得不必每次都使用myproject

這是什麼改變了?我似乎記得要添加到manage.py的路徑中,每當您運行開發服務器時都會調用這個路徑,但這一次並未奏效。

sys.path.append /path/to/myproject 

是否應該解決我遇到的問題?

+0

什麼是您的項目/應用程序目錄結構?當你在app中的文件中使用'from app.file import object'或'from .file import object'時會發生什麼? –

回答

2

我從一個簡單的答案開始,它成長爲更多關於如何將項目的子目錄添加到Python路徑的細節。也許有點脫離主題,但它可能對你有用,所以我推動後按鈕無論如何。

我通常會在我的項目樹中保留一堆小型可重複使用的應用程序,因爲我不希望它們成長爲獨立的模塊。我謨樹看起來就像這樣:

manage.py 
myproject/apps 
myproject/libs 
myproject/settings 
... 

不過,在默認情況下,Django的只是增加項目的根到Python路徑。然而,它使在我看來沒有任何意義有應用負載模塊,完整路徑:

from myproject.apps.author.models import Author 
from myproject.libs.rest_filters import filters 

這兩種方式太囉嗦了,因爲我只用絕對導入它打破了可重用性。更不用說,如果我有一天會從某些庫中構建一個實際的Python包,它將會中斷。

所以,我採取了以下步驟。我加入了相關的文件夾的路徑:

# in manage.py 
root = os.path.dirname(__file__) 
sys.path.append(os.path.realpath(os.path.join(root, 'myproject', 'apps'))) 
sys.path.append(os.path.realpath(os.path.join(root, 'myproject', 'libs'))) 

但你必須確保這些軟件包不能從項目的根目錄加載,否則你將有奇怪的問題,如蟒蛇會加載模塊的另一個副本。例如,isinstance(libs.foo.bar(), myproject.libs.foo.bar) == False

這並不難:只需從您添加到路徑的文件夾中刪除__init__.py即可。這將確保他們不能從項目中落下。

此外,Django的發現跑步者不會下降到這些路徑,除非您手動指定它們。這可能對你很好(如果每個模塊都有自己的測試套件)。或者你可以延長跑步者,所以它知道這個:sample code

+0

感謝@spectras冗長的解釋。即時嘗試讓這個工作,但我不認爲我的sys.path.append線路正在工作。有沒有辦法讓我的sys.path寫出終端,因爲我運行python manage.py runserver以確保它的追加? – bytejunkie

+0

是的,'sys.stderr.write(str(sys.path))'應該可以工作。 – spectras

+0

它確實。路徑正在追加罰款,但編號忘記只改變明確的進口到appname,一旦我工作了,我回來了業務。感謝切入。 – bytejunkie