I primarily work in JavaScript, and I was confused about this common __name__ check pattern at the bottom of many python files.
# Module code here
...
...
if __name__ == "__main__":
# some conditional code that usually runs the module's code directlyThe __name__ Check Pattern: if __name__ == “__main__”:
The __name__ check provides flexibility to allow .py script files to be run in two modes:
- Run the script as the main program itself.
- Run the script as an imported module by another program.
This is a useful pattern for:
- Allow a library module to be run in script mode. Usually for running unit tests or a demo.
- Allows a main program script to include additional APIs for special use cases.
Background: The Python Interpreter
Setting up Special Variables
When the Python interpreter reads a source file, it:
- Sets a few special variables. One of these is
__name__. - Executes all of the code found in the file.
Running Python Code
There are two ways that .py files are run:
- Run as the main file
- Imported as a module from another file
To illustrate this, we have two example python files:
utils.pymain.py
def func():
print("func() in utils.py")
print("top-level in utils.py")
if __name__ == "__main__":
print("utils.py is being run directly")
else:
print("utils.py is being imported into another module")import utils
print("top-level in main.py")
utils.func()
if __name__ == "__main__":
print("main.py is being run directly")
else:
print("main.py is being imported into another module")1. When Your utils.py Module Is the Main Program
If you are running your module (the source file) as the main program, e.g.
$ python utils.py
top-level in utils.py
utils.py is being run directlyThe interpreter will assign the hard-coded string "__main__" to the __name__ variable, and the corresponding conditional block will run.
# It's as if the interpreter inserts this at the top
# of your module when run as the main program.
__name__ = "__main__"
...
...
if __name__ == "__main__": print("utils.py is being run directly")else:
print("utils.py is being imported into another module")2. When Your Module Is Imported By Another Program
If you are running your module as an import from another program, e.g.
$ python main.py
top-level in utils.py
utils.py is being imported into another module
top-level in main.py
func() in utils.py
main.py is being run directlyThe interpreter will assign the name you import the module by (e.g. "utils") to the __name__ variable.
# It's as if the interpreter inserts this at the top
# of your module when run as an import.
__name__ = "utils"
...
...
if __name__ == "__main__":
print("utils.py is being run directly")
else: print("utils.py is being imported into another module")