skymningen
skymningen

Reputation: 113

"Global name not defined" error

There are several posts around this error I have already read, but I still don't get what I am doing wrong.

I put it into a minimal example: Imagine I have a Doc.py, and the package Tools which includes Tool1.py and 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)

If I run this, I always end up with this error:

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

Tool1.REPORT(path)

NameError: global name 'Tool1' is not defined

I'd appreciate any hint to what is going wrong!

Upvotes: 1

Views: 2524

Answers (2)

pjoshi
pjoshi

Reputation: 338

Python will treat any folder as a module when there is __init__.py file present in it. Otherwise it will just be another folder for python and not a module from which it can import things. So just add init.py file in your Tool folder (so it will become module in pythonic terms) and then you can import that module in other python scripts.

One more things for better practice instead of using

from Tools import *

Always provide the file name of library specifically which you want to import like in your case you should use it like this

from Tools import Tool1, Tool2

This will enhance the code readbility for others and for you too.

Upvotes: 0

Martijn Pieters
Martijn Pieters

Reputation: 1121446

Your Tool1 and Tool2 submodules are not visible until explicitly imported somewhere.

You can import them in the Tools/__init__.py package file:

import Tool1, Tool2

at which point they become available for import from Tools.

Another option is to import the modules from your own code:

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

Only when explicitly imported are submodules also set as attributes of the package.

Upvotes: 3

Related Questions