我的Python应用程序结构如下:
run.py
app/__init.py__
app/config.py
app/<other modules in app>
在我的app/__init.py
中,我想检查一个变量DEBUG_MODE
,根据它的值,如果是DEBUG_MODE == False
,则启动一个python Logger
,如果是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
...
运行.py
from app import config
config.DEBUG_MODE = True
from app import app
当然,问题是,当我的代码到达config.DEBUG_MODE=True
时,app
模块的init代码已经被调用,因为我的配置文件是应用程序模块的一部分。
我如何告诉模块我想在运行时从我的run.py脚本启用调试?
此问题的原因是config.py
是app
模块和命名空间的一部分-对它及其变量的任何引用都需要首先评估app/__init__.py
。
解决方法之一是劫持所有Python模块都可用的Python __builtin__
"模块",并添加我们自己的变量:
运行.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
...