在导入模块__init.py__之前设置变量

时间:2015-02-03 16:27:17

标签: python python-2.7 flask global-variables

我的Python应用程序结构是:

run.py
app/__init.py__
app/config.py
app/<other modules in app>

在我的app/__init.py中,我想检查变量DEBUG_MODE并根据其值,启动python Logger if DEBUG_MODE == False,然后只需打印到控制台如果是True。我目前尝试(而不是工作)的解决方案是有三个文件:

应用程序/ config.py

DEBUG_MODE = False

应用程序/ __初始化__。PY

app = MyApp()
from config import DEBUG_MODE
app.debug = DEBUG_MODE
if not app.debug:
    import logging
    ...

run.py

from app import config
config.DEBUG_MODE = True
from app import app

问题当然是,当我的代码到达config.DEBUG_MODE=True时,app模块的init代码已被调用,因为我的配置文件是app模块的一部分。

如何从run.py脚本告诉模块我想在运行时启用调试

1 个答案:

答案 0 :(得分:2)

此问题的原因是config.pyapp模块和命名空间的一部分 - 对它及其变量的任何引用都需要首先评估app/__init__.py

绕过它的一种方法是劫持Python __builtin__“模块”,它可用于所有Python模块,并添加我们自己的变量:

run.py

import __builtin__
__builtin__.myapp_debug = True
from app import app

然后在模块__init __。py:

# app is instantiated as an Object
import __builtin__
if hasattr(__builtin__, "myapp_debug"):
    app.debug = __builtin__.myapp_debug
else:
    app.debug = False
# If debugging is off, use file-based logging:
if not app.debug:
    print "Setting up logging..."
    import logging
    ...