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

Python全局导入遇NameError:error函数未定义问题求助

解决import * 引发的NameError问题

问题场景

我有三个Python文件:

  1. message.py - 定义带颜色的日志输出函数:
def error(message):
    print(f"\033[91m{message}\033[00m")


def warning(message):
    print(f"\033[93m{message}\033[00m")


def info(message):
    print(f"\033[96m{message}\033[00m")


def success(message):
    print(f"\033[92m{message}\033[00m")
  1. imports.py - 全局导入文件,集中管理所有依赖:
import humps
import inflect
import json
import visitor
import logging
from message import *
error('hi')
import os
import re
import subprocess
import sys
  1. visitor.py - 业务代码文件,通过全局导入获取依赖:
from imports import *

def visitChildren(node, analyze):
    nodeType = type(node).__name__
    if nodeType == 'dict':
        for childNode in node:
            childNodeType = type(node[childNode]).__name__
            try:
                if (childNodeType == 'dict'):
                    analyze(node[childNode])
                visitChildren(node[childNode], analyze)
            except Exception as ex:
                error(f'\t{ex}')
    if nodeType == 'list':
        for index in range(len(node)):
            visitChildren(node[index], analyze)

def visit(path, analyze):
    if path == '':
        pass
    else:
        try:
            file = open(path)
            data = json.load(file)
            visitChildren(data, analyze)
        except Exception as ex:
            error(f'\tFile {path} has no AST or its AST can not be loaded')
            error(f'\t{ex}')

现象:imports.py中调用error('hi')完全正常,但visitor.py执行时抛出错误:

NameError: name 'error' is not defined. Did you mean: 'OSError'?

问题根源

这是循环导入+导入顺序导致的问题:

  • imports.py在开头就导入了visitor,此时visitor.py会立刻执行from imports import *
  • 但此时imports.py还没执行到from message import *这一行,error等函数还没被添加到imports模块的命名空间中
  • 所以visitor.py通过from imports import *无法获取到error函数

解决方案

调整imports.py的导入顺序,把import visitor移到所有导入语句的最后,确保在导入visitor之前,所有需要导出的内容都已经加载完成:

修改后的imports.py代码:

import humps
import inflect
import json
import logging
from message import *
import os
import re
import subprocess
import sys
import visitor  # 移至最后

error('hi')

这样修改后,当imports.py执行到import visitor时,from message import *已经执行完毕,error等函数已经存在于imports的命名空间中,visitor.py通过from imports import *就能正常获取到error函数了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 22:03:23