【问题标题】:"Global name not defined" error“未定义全局名称”错误
【发布时间】:2013-07-03 13:15:08
【问题描述】:

我已经阅读了几篇关于这个错误的帖子,但我仍然不明白我做错了什么。

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

文档.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__()

工具1.py:

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

Tool2.py:

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

如果我运行它,我总是会遇到这个错误:

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

Tool1.REPORT(路径)

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

如果有任何提示,我将不胜感激!

【问题讨论】:

    标签: python python-2.7


    【解决方案1】:

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

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

    import Tool1, Tool2
    

    此时它们可以从Tools 导入。

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

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

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

    【讨论】:

    • 谢谢,将它们导入 init 文件就可以了!
    【解决方案2】:

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

    为了更好的实践而不是使用更多的东西

    from Tools import *
    

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

    from Tools import Tool1, Tool2
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-09
      • 1970-01-01
      • 1970-01-01
      • 2013-06-07
      • 2014-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多