You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何AppFilter(logging.basicConfig)中全局变量为空?如何解决?

为什么log.py中的MY_VARIABLE始终为空?如何解决?

问题原因

  • 导入变量是复制而非引用:main.py和log.py中使用from config import MY_VARIABLE时,会将config.py里MY_VARIABLE的当前值复制到各自模块的命名空间,两个模块的MY_VARIABLE是独立变量,修改其中一个不会影响另一个。
  • global关键字误用:main.py里的global MY_VARIABLE无效,因为MY_VARIABLE并非main.py自身定义的全局变量,而是从外部模块导入的,该声明无法修改config.py中的原变量。

解决方案

方法1:直接通过模块对象访问/修改变量(推荐)

放弃单独导入变量,改为导入整个config模块,所有操作直接针对模块内的原变量:

修改main.py:

from log import *
import config

for i in range(3):
    print(f"main.py Old: '{config.MY_VARIABLE}'")
    config.MY_VARIABLE = i
    print(f"main.py New: '{config.MY_VARIABLE}'")
    
    logging.info("The process is running...")

修改log.py:

import logging
import config

class AppFilter(logging.Filter):
    def filter(self, record):
        print(f"log.py MY_VARIABLE:{config.MY_VARIABLE}")
        record.my_variable = config.MY_VARIABLE
        return True

logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s %(levelname)s (%(my_variable)s) > %(message)s',
    datefmt='%H:%M:%S'
)
logging.getLogger('').addFilter(AppFilter())

方法2:用可变容器包装变量

将config.py中的变量放入可变容器(如字典),利用可变对象的引用共享特性实现同步:

修改config.py:

CONFIG = {
    'MY_VARIABLE': ''
}

修改main.py:

from log import *
from config import CONFIG

for i in range(3):
    print(f"main.py Old: '{CONFIG['MY_VARIABLE']}'")
    CONFIG['MY_VARIABLE'] = i
    print(f"main.py New: '{CONFIG['MY_VARIABLE']}'")
    
    logging.info("The process is running...")

修改log.py:

import logging
from config import CONFIG

class AppFilter(logging.Filter):
    def filter(self, record):
        print(f"log.py MY_VARIABLE:{CONFIG['MY_VARIABLE']}")
        record.my_variable = CONFIG['MY_VARIABLE']
        return True

logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s %(levelname)s (%(my_variable)s) > %(message)s',
    datefmt='%H:%M:%S'
)
logging.getLogger('').addFilter(AppFilter())

内容的提问来源于stack exchange,提问作者Olga

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 22:25:24