“全局名称未定义”错误

时间:2013-07-05 12:22:03

标签: python python-2.7

我已经阅读了几个关于此错误的帖子,但我仍然没有得到我做错的事。

我把它放在一个最小的例子中: 想象一下,我有一个Doc.py,包工具包括Tool1.py和Tool2.py。

Doc.py:

from Tools import *
import sys

def __main__():
    TOOL_REPORT("Tool1","Test")

def TOOL_REPORT(tool, path):
    if(tool == 'Tool1'):
        Tool1.REPORT(path)
    elif(tool == 'Tool2'):
        Tool2.REPORT(path)
    else:
        sys.stderr.write("This tool is not yet included in Doc. Please check TOOLS for more information.")

if __name__=="__main__": __main__()

Tool1.py:

def REPORT(path):
    print("Tool1 "+path)

Tool2.py:

def REPORT(path):
    print("Tool2 "+path)

如果我运行此操作,我总是会遇到此错误:

  

文件“Doc.py”,第15行,TOOL_REPORT

     

Tool1.REPORT(路径)

     

NameError:未定义全局名称“Tool1”

我很欣赏任何出错的暗示!

2 个答案:

答案 0 :(得分:3)

在明确导入某处之前,您的Tool1Tool2子模块不可见。

您可以在Tools/__init__.py包文件中导入它们:

import Tool1, Tool2

此时它们可以从Tools导入。

另一种选择是从您自己的代码中导入模块:

import Tools.Tool1, Tools.Tool2
from Tools import *

仅在显式导入子模块时,还将其设置为包的属性。

答案 1 :(得分:0)

当文件中存在__init__.py文件时,Python会将任何文件夹视为模块。否则它只是python的另一个文件夹,而不是一个可以导入东西的模块。所以只需在你的工具文件夹中添加 init .py文件(因此它将以pythonic术语成为模块),然后你可以在其他python脚本中导入该模块。

为了更好的练习而不是使用

,还有一件事情
from Tools import *

始终提供您要导入的库的文件名,就像您要使用它一样

from Tools import Tool1, Tool2

这将增强其他人和您的代码可读性。