在python中使用exec与import

在python中使用exec与import,python,django,settings,Python,Django,Settings,在django中,使用local_settings.py文件来补充settings.py非常常见,这样每台机器都可以有不同的设置。通常人们会这样做 try: from local_settings import * except ImportError: print "No local settings found!" 但设置文件通常包含大型列表,如已安装的应用程序。如果我想添加一个应用程序,我不希望将整个列表复制到local\u settings.py并对其进行修改(这会导致

在django中,使用
local_settings.py
文件来补充
settings.py
非常常见,这样每台机器都可以有不同的设置。通常人们会这样做

try:
    from local_settings import *
except ImportError:
    print "No local settings found!"
但设置文件通常包含大型列表,如
已安装的应用程序
。如果我想添加一个应用程序,我不希望将整个列表复制到
local\u settings.py
并对其进行修改(这会导致代码可读性降低,并且更新
settings.py
不再影响任何重新写入
已安装的应用程序的机器)。所以我想我可以这样做:

try:
    f = open('local_settings.py','r')
    exec f.read()
except IOError:
    print "No local settings found!"
现在
local\u settings.py
不再需要重写整个
INSTALLED\u APPS
变量:

INSTALLED_APPS.append('debug_toolbar')

我的印象是,无论何时使用
exec
eval
都可能是做错了什么。所以我的问题是,这有什么问题吗?还有更好的方法吗?

有一个更好的方法:在
local\u settings.py中导入
已安装的应用程序
,复制它,然后添加到副本中:

import settings

INSTALLED_APPS = settings.INSTALLED_APPS[:] + ['debug_toolbar']
这是我的技巧:

设置.py

try:
    from local_settings import *
except ImportError:
    sys.exit("FATAL: No local settings file found.")

本地设置.py

import settings

settings.INSTALLED_APPS += ('django_extensions',)

您希望拥有可修改的默认值,但这并不妨碍使用
import
。为什么您认为需要使用
exec
来完成这项工作?这不是一个周期性的导入吗?如果不导入本地设置,则无法导入设置,如果不导入设置,则无法…我将
try
语句放在
settings.py
的底部,因此已定义
已安装的应用程序。这样,您也可以覆盖设置(例如
settings.DEBUG=True
),我切换到了这个方法(在我最后一次评论之前),所以我知道它可以工作。我只是不明白这是如何避免周期性进口问题的。你的评论很好地解释了这一点,谢谢。非常迷人。