所以我有几个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
的消息,反之亦然。所有路由都基于配置的记录器/处理程序,包括 apps。部分。
那么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'
答案 0 :(得分:6)
__name__
是导入当前模块的名称。
如果模块是使用import saml.xyz
导入的,__name__
会直接反映该模块。如果您有时看到apps.saml.xyz
,那么您的模块是使用那个名称导入的,并且您的模块有两个副本已加载到内存中; Python认为这两者是分开的。
您应该避免导入嵌套模块;仅使用 顶级名称。坚持apps.saml.xyz
或saml.xyz
,但如果必须使用后者,请确保apps/
不一个包,并且它本身不在python模块上列出搜索路径sys.path
。