如何创建用于导入的默认python子模块

时间:2013-07-02 06:24:30

标签: python

我正在使用python设置文件。我有以下结构:

settings
├── base.py
├── __init__.py
├── local.py
├── production.py
└── staging.py

设置模块从环境变量中获取,例如'settings.production'。这样可以正常工作并替换旧的不灵活的settings.py文件,这样我就可以很好地组织分段,生产和本地站点的设置。

调用代码中的settings = importlib.import_module(os.environ['DJANGO_SETTINGS_MODULE'])会选择我的新灵活设置,就好像它们是旧模块一样很酷并且大部分时间都能正常工作。

不幸的是,旧的遗留代码,其中有很多,现在然后调用“导入设置”,这就失败了。

我需要'import settings'完全等同于'import settings.production',或者环境变量中指定的任何内容,以便支持遗留代码而不会失去灵活设置配置的好处。

注意:是的,这是我使用的是一个古老而又非常大的Django 1.3网站,但我相信我已经将这个问题独立于Django了。

1 个答案:

答案 0 :(得分:0)

写这个问题是一种宣泄。这是我的解决方案:

在我设置的__init__.py设置模块中:

import os
import importlib
try:
    # Do a dynamic 'from DJANGO_SETTINGS_MODULE import *'
    settings = importlib.import_module(os.environ['DJANGO_SETTINGS_MODULE'])
    for v in dir(settings):
        if v.startswith("__"): continue
        globals()[v] = getattr(settings, v)
except ImportError, KeyError:
    # default to the production settings if environment variable not set or improperly specified
    from production import *

这确实做了一些额外的工作,但它很好地解决了这个问题。现在我的遗留程序获得了所需的设置。

实质上,这会使import settings == import settings.xxx在环境变量DJANGO_SETTINGS_MODULE中指定settings.xxx

我希望其他人觉得这很有用。请注意,只要你使用的应用程序正确导入设置,DJANGO的新版本就不需要这个恶作剧。