所以我有几个django设置文件,一个用于测试,另一个用于不同的客户.
这些设置文件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__
给哪个文件,以及我的不同设置文件如何在__name__
不改变sys.path的情况下影响它?
命令在其他方面是相同的:
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'
Martijn Piet.. 6
__name__
是导入当前模块的名称.
如果模块与进口import saml.xyz
,__name__
反映了直接.如果您有时看到apps.saml.xyz
您的模块是使用该名称导入的,并且在内存中加载了两个模块副本; Python认为这两者是分开的.
您应该避免导入嵌套模块; 使用只有顶级名.坚持无论是apps.saml.xyz
或saml.xyz
,但如果是后者,必须使用,要确保apps/
是不是一个包,而不是本身的Python模块搜索路径中列出sys.path
.
__name__
是导入当前模块的名称.
如果模块与进口import saml.xyz
,__name__
反映了直接.如果您有时看到apps.saml.xyz
您的模块是使用该名称导入的,并且在内存中加载了两个模块副本; Python认为这两者是分开的.
您应该避免导入嵌套模块; 使用只有顶级名.坚持无论是apps.saml.xyz
或saml.xyz
,但如果是后者,必须使用,要确保apps/
是不是一个包,而不是本身的Python模块搜索路径中列出sys.path
.