【问题标题】:Set a variable before importing module __init.py__在导入模块 __init.py__ 之前设置一个变量
【发布时间】:2015-02-03 16:27:17
【问题描述】:

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

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

【问题讨论】:

  • 你要从命令行运行这个吗?
  • 最初,出于调试目的,是的。稍后我会将它作为 CGI 运行,在这种情况下不会设置 DEBUG_MODE(并且会发生基于文件的日志记录)。但是现在,当我开发它时,它将从命令行运行。
  • 您始终可以使用sys.argv 获取命令行参数并在初始化代码中进行处理。
  • 不幸的是,这个应用程序是一个 Flask 应用程序,run.py 脚本所做的最后一件事是启动 Flask 应用程序管理器(它使用命令行参数来确定要做什么)。可能有一种方法可以重新构建它(例如在导入模块后等待设置日志记录),但我想知道我是否可以设置一个变量以在运行时由模块的 __init__ 代码读取。
  • 运行时是什么意思?您可以使用配置选项编写一个 .ini 文件,并从 app/__init__.py 文件中处理它......我不知道您可以获得多接近运行时。我有一段时间没有用 python 写太多东西了,但除非我误解了这个问题,如果你想在运行时运行一些东西,把它扔到你的 __init__.py 文件中。

标签: python python-2.7 flask global-variables


【解决方案1】:

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

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

运行.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
    ...

【讨论】:

  • 我打算建议这个,但是有很多人不喜欢打鸭子/打猴子,所以我推迟了。显然,我不是那些看不起这种做法的人之一:P
  • 这不是最优雅的,但我愿意接受其他建议。一个想法是让我的app 模块导入的另一个 模块,我可以从我的运行脚本导入并在app 导入它之前进行修改......如果你有任何想法并提出它变成我会接受的答案。 :-)
  • 老实说,恕我直言,最简单的方法就是完全按照您对内置模块所做的操作。只要与您合作的任何其他开发人员不介意您这样做:P 内省是 python 的优势之一,那么您为什么不使用它呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
  • 2020-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多