2012-05-05 55 views
2

我有一個Django的結構是這樣的(只顯示庫):全局/應用程序文件夾的lib導入在Django

project/lib/ # Global libraries that will be used cross apps 
project/lib/global_stuff.py 
project/apps/app1/lib/special_for_app1.py 
project/apps/app2/lib/special_for_app2.py 

一些應用程序沒有一個lib文件夾。

from apps.app1.lib import special_for_app1工作正常。但是當我在已經包含本地lib文件夾的文件夾中時,如何從全局lib文件夾導入?

從應用程序內的views.py在應用程序的一個文件:


from lib import global_stuff 

給我ImportError: cannot import name global_stuff


從進口的.lib global_stuff

給我ImportError: cannot import name global_stuff


from ..lib import global_stuff 

給我ImportError: No module named lib


from ...lib import global_stuff 

給我ValueError: Attempted relative import beyond toplevel package


from project.lib import global_stuff 

的作品,但我真的不希望使用項目名稱本身被卡住在im港口。


有沒有什麼辦法可以解決這個問題,而不是在導入中使用項目名稱,或者改變整個lib的想法。

或者是否有任何其他良好的做法來存儲代碼的主要部分?

+0

您是否確保每個目錄都有一個'__init __。py'?你有沒有把「/ path/to/project」放到你的PYTHONPATH中? – rantanplan

+0

是的,每個目錄都有一個__init__.py,並且sys.path中的第一個條目是項目目錄。 – xeor

回答

4

你是正確的不想要的項目名稱與進口相關聯,所以有一個共同的模式來此:

project/ 
    |__/source/ 
    |  |__/lib/ 
    |  |__/app/ 
    |__/deployment/ # code for your production deployment maybe 
    | 
    |__/docs/ 
    |__/tests/ 
    |__README 
    |__requirements.txt 

,並把/路徑/要/你的路內的項目在您的virtualenv(你使用virtualenv吧?)。

然後你可以在你的代碼裏做

from source.lib.blah import foo 
from source.app.baz import bar 

編輯:這是唯一的最佳的,如果你不釋放你的代碼,當然作爲開源。只有當您有一個內部項目時,管理層不斷更改項目名稱:D

+0

是的,virtualenv和heroku和你指出的結構。但不是稱爲目錄源,而是將其稱爲項目名稱本身。也許我應該重新命名它。 – xeor

+0

我希望你讀我的編輯!如果你打算在社區發佈它,你最好堅持一個項目名稱!想象一下,有人把你的項目作爲第三方應用程序,並從源代碼進行引用。不好:) – rantanplan

+0

是的,我讀過它,「幸運地」我不能將它作爲一個開源項目發佈。然而,「源」作爲名稱對我來說看起來有點不對勁,但是非常有用。讓我知道如果你想出一個更好的名字:) – xeor

3

我真的不希望在進口

爲什麼不使用項目名稱本身被卡住?這是最好的方式。請注意,「內包裝進口的相對進口非常令人沮喪」, - said in PEP-8

+0

我希望它儘可能便攜,即使在重命名項目時也是如此。這就是爲什麼我看到在導入中使用項目名稱作爲最後的手段。 – xeor

+2

@xeor如果你想要一個應用程序是可移植的,你不能依賴項目的數據。將'global_stuff'移動到應用程序的文件夾中,或者製作'global_stuff'另一個應用程序並添加'requirements.txt'。 – DrTyrsa

+0

核心應用程序創建:)感謝您的想法 – xeor

相關問題