首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“全局名称未定义”错误

“全局名称未定义”错误
EN

Stack Overflow用户
提问于 2013-07-05 12:22:03
回答 2查看 2.4K关注 0票数 1

关于这个错误,我已经读过几篇文章,但我仍然不明白我做错了什么。

我把它放在一个最小的例子中:假设我有一个Doc.py,以及包含Tool1.py和Tool2.py的包工具。

Doc.py:

代码语言:javascript
复制
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:

代码语言:javascript
复制
def REPORT(path):
    print("Tool1 "+path)

Tool2.py:

代码语言:javascript
复制
def REPORT(path):
    print("Tool2 "+path)

如果运行此操作,则始终会出现以下错误:

Doc.py文件,第15行,在TOOL_REPORT中 Tool1.REPORT(路径) NameError:未定义全局名称“Tool1”

我很想知道到底出了什么问题!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-05 12:24:11

在显式导入某个地方之前,Tool1Tool2子模块是不可见的。

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

代码语言:javascript
复制
import Tool1, Tool2

此时,它们可以从Tools导入。

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

代码语言:javascript
复制
import Tools.Tool1, Tools.Tool2
from Tools import *

只有在显式导入时,子模块才被设置为包的属性。

票数 3
EN

Stack Overflow用户

发布于 2016-12-29 06:03:56

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

还有一件事是为了更好的实践而不是用

代码语言:javascript
复制
from Tools import *

始终提供库的文件名,特别是要导入的文件名,在您的情况下,您应该像这样使用它

代码语言:javascript
复制
from Tools import Tool1, Tool2

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17488804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档