在python中使用exec与import
在django中,使用在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并对其进行修改(这会导致
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
),我切换到了这个方法(在我最后一次评论之前),所以我知道它可以工作。我只是不明白这是如何避免周期性进口问题的。你的评论很好地解释了这一点,谢谢。非常迷人。