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 aboutif __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.