2013-12-03 41 views
3

所以我有幾個django設置文件,一個用於測試,另一個用於不同的客戶。__name__的值來自哪裏?

根本沒有這些設置文件更改sys.path

它們都包含一個單獨的基本設置文件,其中包含INSTALLED_APPS

大多數文件有代碼,這是否:

import logging 
logger = logging.getLogger(__name__) 

logger.error("Something went wrong") 

在我的測試設置文件,模塊__name__看起來像saml.xyz所以logger.name是saml.xyz但是當我使用不同的設置文件中,模塊__name__看起來像apps.saml.xyz這使得logger.name apps.saml.xyz

這會導致某些日誌消息被錯過,因爲處理程序連接到錯誤的地方。 saml.xyz的處理程序不會收到apps.saml.xyz的消息,反之亦然。所有路由都基於配置的記錄器/處理程序,包括應用程序。部分與否。

那麼python如何決定哪個__name__給一個文件,以及我的不同設置文件如何在不改變sys.path的情況下影響__name__

的命令是其它方面相同:

python manage.py test --settings=projectname.test saml 

其產生

>>> logger.name 
'saml.xyz' 

python manage.py test --settings=projectname.customer saml 

其產生

>>> logger.name 
'apps.saml.xyz' 

回答

5

__name__是當前模塊導入的名稱。

如果模塊是用import saml.xyz導入的,__name__直接反映了這一點。如果您有時看到apps.saml.xyz,那麼您的模塊是使用導入的,即名稱,並且您的模塊有兩個副本加載到內存中; Python認爲這兩者是分開的。

您應該避免導入嵌套模塊;使用只有的頂級名稱。堅持要麼apps.saml.xyzsaml.xyz,但如果後者必須使用,請確保apps/而不是一個軟件包,並不是本身列在python模塊搜索路徑sys.path

+0

所以我通過''from'app''替換''來完成整個項目,所以這個問題是不可能的。它仍然發生。然後我想到了INSTALLED_APPS,從那裏刪除了'apps.',問題就解決了。我仍然不知道不同的設置文件如何導致這種情況。由於它安裝的應用程序很常見,沒有應用程序從設置模塊導入。 – boatcoder

+0

@ Mark0978:這意味着'apps /'目錄本身*和*它的父目錄都列在'sys.path'中,並且有'__init__。py'文件*在*'apps /'中。這使'apps'既可以作爲一個包,也可以作爲Python的頂級目錄來查找模塊,而且你不想同時擁有這兩個模塊。它導致像這樣的錯誤。 –

+0

所以我應該把'from apps.'放回去,並確保'apps /'不在python路徑中?我實際上更喜歡導入中的'apps.'來指出哪些是該項目的一部分,而不是外部應用程序。 – boatcoder