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

Set a variable before importing module __init.py__

我的 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,只需打印到控制台。我目前尝试(但不工作)的解决方案是拥有三个文件:

app/config.py

DEBUG_MODE = False

app/__init__.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 模块的初始化代码已经被调用,因为我的配置文件是应用程序模块的一部分。

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

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

绕过它的一种方法是劫持 Python __builtin__ "module",它对所有 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
    ...