2013-07-05 197 views
1

有几个帖子围绕这个错误我已经阅读,但我仍然没有得到我做错了什么。“全局名称未定义”错误

我把它放到一个最简单的例子中: 想象一下,我有一个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) 

如果我运行此,我总是这个错误结束:

File "Doc.py", line 15, in TOOL_REPORT

Tool1.REPORT(path)

NameError: global name 'Tool1' is not defined

我会很感激任何错误的提示!

回答

3

你的Tool1Tool2子模块是不可见的,直到明确导入某处

可以导入他们在Tools/__init__.py包文件:

import Tool1, Tool2 

他们成为可供导入从Tools在这一点。

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

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

只有明确导入的子模块也设置为包的属性。

+0

谢谢你,将它们导入到__init__文件中有窍门! – skymningen

0

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

from Tools import * 

始终提供库的文件名特别要在你的情况下导入像

还有一件事你应该使用这样

from Tools import Tool1, Tool2 

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

相关问题