在我的某些Django应用中,我使用settings_local.py
文件覆盖各种环境(例如,开发,测试和生产)中不同的设置。我最初使用以下代码将其内容包含在settings.py
中:
try:
from settings_local import *
except ImportError:
sys.stderr.write("The settings_local.py file is missing.\n")
DEBUG=False
我最近找到了
execfile
函数,并切换为以下内容:try:
execfile(path.join(PROJECT_ROOT, "settings_local.py"))
except IOError:
sys.stderr.write("The settings_local.py file is missing.\n"
DEBUG=False
两者都按预期工作,但是我很好奇我是否会错过任何陷阱,总的来说,更推荐哪种方法以及为什么。
最佳答案
每次评估设置文件时,使用execfile
函数都会对Python源文件(.py)进行评估。您每次都在执行Python解析器。使用import
不一定可以做到这一点(可能使用.pyc文件)。通常,第一次使用Python(至少是cPython)运行项目时,它会被编译为字节码,而不会再次重新编译。你在打破那个。这不一定是问题,但是您应该意识到这一点。
使用execfile
也将导致您在settings_local.py
文件的模块范围内重新评估settings.py
文件中可能具有的所有导入。使用import *
会将所有项目包括在settings_local.py
模块范围内。最终效果是相同的(settings_local.py
模块范围中包括的所有项目都包括在settings.py
中),但是方法不同。
最后,将模块作为模块而不是包含在模块中执行是正常的。代码包含os.path.dirname(__file__)
之类的东西是合理的。如果有任何代码确实使用了此功能,那么您会感到困惑,因为该代码将不再在作者可能合理期望的模块中执行。
根据我的经验,人们使用import
而不是execfile
。 Django非常“常规化”。遵守约定。
关于Python: 'import *'与execfile,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11703327/