BYU logo Computer Science

What is if __name__ == "__main__"?

🛑 IMPORTANT NOTE:

This guide is not required to know for the course, but if you would like to understand more about if __name__ == "__main__" and what it does, then this guide might be useful after you have learned about modules and imports.

When python runs a file, it sets a variable called __name__ to "__main__". This allows python to differentiate between the main file that is being run in a script and other files that are being imported.

For example, here is a file called my_script.py:

def main():
    print("This is inside of my_script's main function!")

print("This is outside of a function!")

if __name__ == "__main__":
    print("This is my_script!")
    main()

Running the program with

python my_script.py

sets __name__ to "__main__" in my_script.py, so the if __name__ == "__main__": statement is true and the print statement is executed.

This is outside of a function!
This is my_script!
This is inside of my_script's main function!

Notice the order of the print statements. Python runs the code from top to bottom, first defining the function main(), then printing "This is outside of a function!", then checking if __name__ is equal to "__main__", and finally calling the main() function.

Now let’s say we have another file called other_script.py that imports my_script.py:

import my_script

if __name__ == "__main__":
    print("This is the other_script!")
    my_script.main()  ## We call my_script's main function here

Running the program with

python other_script.py

results in the following output:

This is outside of a function!
This is the other_script!
This is inside of my_script's main function!

Notice that the print statement outside of the function in my_script.py is executed when other_script.py imports my_script.py.

When you import a module (or file) in python, the entire imported file is evaluated, so the print statement outside of our main function is invoked; however, when a module is imported, python doesn’t set its __name__ variable to "__main__", so the if __name__ == "__main__": statement is false and that block is not executed.

Hopefully you see that having code outside of a defined function or the if __name__ == "__main__": block is bad practice as it can result in unwanted code being run or cause larger errors. Defining functions and using the if __name__ == "__main__": statement are used to protect code that you don’t want to run when you import the script from another file. This is especially useful when creating larger multi-file programs, testing specific functions, or parsing command-line arguments.