我已经阅读了几个关于此错误的帖子,但我仍然没有得到我做错的事。
我把它放在一个最小的例子中: 想象一下,我有一个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”
我很欣赏任何出错的暗示!
答案 0 :(得分:3)
在明确导入某处之前,您的Tool1
和Tool2
子模块不可见。
您可以在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
这将增强其他人和您的代码可读性。