我從一個簡單的答案開始,它成長爲更多關於如何將項目的子目錄添加到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。
什麼是您的項目/應用程序目錄結構?當你在app中的文件中使用'from app.file import object'或'from .file import object'時會發生什麼? –