在一些我的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是非常“约定优于配置”。 按照约定。
另一个不同之处:得到的execfile上下文字典; 默认情况下,全球范围内或指定的字典。 这可能会允许一些奇怪的事情
dont_do_this.py
:
# Probably not a good thing to do
z=x+1 # an expression that involves an un-defined field
明显,
from dont_do_this import *
失败。
然而,
d={'x':1}
execfile( 'dont_do_this.py', d )
是OK并且导致d=={'x':1, 'z':2}
注意
x=1
execfile( 'dont_do_this.py' )
是OK,并在不同的结果z
被加入到全局。
第一个版本( from settings_local import *
)是每个人都希望看到。 它也将让代码分析器找到该模块。