What is if __name__ == '__main__' ?

Understand how __name__ and __main__ work in Python 3

What is if __name__ == '__main__' ?

So what is __ name __?

Before we get rolling, I want you to create 2 python files. For the sake of this article, I will create test.py and test2.py.

When the Python interpreter executes a file, it defines a few special variables. One of them is the __name__ variable.

# test.py

print("This is the test file")
print(__name__)

>>> This is the test file
    __main__

See how when we print __name__, it prints out __main__. What happens is, Python assigns the hard-coded string "__main__" to the __name__ variable.

So when you use if __name__ == "__main__" in your python script, you are asking Python to run the script as the main file.

Check out the 2 scripts below.

Script 1

# test.py

def hello():
    return "I am saying Hello"

print(hello())

and then,

Script 2

# test.py

def hello():
    return "I am saying Hello"

if __name__ == "__main__":
    print(hello())

There is no difference between Script 1 and Script 2. Both of them will output the below result.

>>> I am saying Hello

So why use if __ name __ == “__ main __“?

You will understand the difference when you start importing your test.py as a library.

Let’s make some changes to our test.py.

# test.py

def hello():
    return "This is from test.py"

if __name__ == "__main__":
    print("Executing test.py")
    
print(hello())

When we run the above script, we get the following results.

>>> Executing test.py
    This is from test.py

Let’s now make use of test2.py. We will import test.py into our test2.py.

# test2.py

import test

def hello2():
    return "This is test2"

if __name__ == '__main__':
    print(hello2())

Now if you run test2.py, you should get the following result.

>>> This is from test.py
    This is test2

When you import a python file, the code in the python file is executed first. Notice how, Executing test.py line didn’t get printed out. This is because it is within the if __ name __ == "__ main __" block.

Let’s now change the test.py to print the __name__ variable.

# test.py

def hello():
    return "This is from test.py"

if __name__ == "__main__":
    print("Executing test.py")

print(hello())
print(__name__) # New print statement

When we execute test.py now, we will get the following results.

>>> Executing test.py
    This is from test.py
    __main__

Now if we execute test2.py, we should get the following result.

This is from test.py
test # Result of printing __name__
This is test2

So now instead of printing __main__, the print(__name__) statement prints out the name of the file.

This is the benefit of using if __ name __ == "__ main __". You can easily identify which variables are being imported from which libraries.

Subscribe to Pylenin

Don’t miss out on the latest issues. Sign up now to get access to the library of members-only issues.
jamie@example.com
Subscribe