2013-07-05 254 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 

這將增強其他人和您的代碼可讀性。

相關問題