Python 在导入模块_init.py之前设置一个变量__

Python 在导入模块_init.py之前设置一个变量__,python,python-2.7,flask,global-variables,Python,Python 2.7,Flask,Global Variables,因此,我的Python应用程序结构是: run.py app/__init.py__ app/config.py app/<other modules in app> app/\uuuu init\uuuuu.py app = MyApp() from config import DEBUG_MODE app.debug = DEBUG_MODE if not app.debug: import logging ... run.py from app import

因此,我的Python应用程序结构是:

run.py
app/__init.py__
app/config.py
app/<other modules in app>
app/\uuuu init\uuuuu.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
import __builtin__
__builtin__.myapp_debug = True
from app import app
当然,问题是当我的代码到达
config.DEBUG_MODE=True
时,
app
模块的初始化代码已经被调用,因为我的配置文件是app模块的一部分


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

此问题的原因是
config.py
app
模块和命名空间的一部分-对它及其变量的任何引用都需要首先计算
app/\u init\uuuuuuuupy

一种解决方法是劫持Python
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu内置的“模块”,该模块可用于所有Python模块,并添加我们自己的变量:

run.py

from app import config
config.DEBUG_MODE = True
from app import app
import __builtin__
__builtin__.myapp_debug = True
from app import app
然后在模块uuu init_uuuu.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
    ...

是否要从命令行运行此操作?最初,出于调试目的,是的。稍后,我将以CGI的形式运行它,在这种情况下,将不会设置DEBUG_模式(并且将发生基于文件的日志记录)。但就目前而言,在我开发它时,它将从命令行运行。您可以始终使用获取命令行参数并从init代码中处理它。不幸的是,此应用程序是一个Flask应用程序,run.py脚本所做的最后一件事是启动Flask应用程序管理器(它使用命令行参数来确定要做什么)。可能有一种方法可以重新构建它(例如在导入模块后等待设置日志记录),但我想知道我是否可以设置一个变量,以便在运行时由模块的_uinit___;代码读取。运行时是什么意思?您可以使用配置选项编写一个.ini文件,然后从app/_____; init.py文件中处理它……我不知道离运行时有多近。我有一段时间没有用python写过很多东西,但除非我错了理解这个问题,如果你想在运行时运行一些东西,把它放到你的
\uuu init\uuuuuuuuuuy.py
文件中。我本打算提出这个建议,但有很多人不喜欢打鸭子/打猴子补丁,所以我一直在拖延。显然,我不是那种看不起这种做法的人:PIt不是最优雅的,但我“我愿意接受其他建议。一个想法是让我的
应用程序
模块导入另一个模块,我可以从我的运行脚本中导入并在它被
应用程序
导入之前进行修改……如果你有任何想法并将其放入答案中,我会接受它。:-”,IMHO最简单的方法就是完全按照您对内置模块所做的操作。只要和你一起工作的任何其他开发人员都不介意你这么做:P内省是蟒蛇的优势之一,那么你为什么不使用它呢?