WTF is if __name__ == '__main__'?
You’ve started reading, running, and even writing Python scripts. Maybe you are so smart that you understand 50-60% of the code you’re looking at. That’s great! At the very bottom of many scripts, though, lurks the cruftiest of code blocks:
Wow, seriously? Double underscores? Can it get any uglier or more obscure? Not to worry; this post will move that gibberish from “WTF”-land to “Oh, of course”-ville.
The short version
That weird and off-putting code basically says “If somebody is running this program from the command line, just execute the
main() function.” Put it in any script you’ll want to run as a standalone utility. (Of course, your script also needs a
main() function for this to work.)
The long version
.py file is a module. When you run a program with a command like
python my_program.py, the Python interpreter considers
my_program to be the “main” module, and will signify this by setting the module’s
__name__ variable to have the value
'__main__' (that’s a string).
This variable starts and ends with double underscores, which marks it as a “magic” attribute (see here). You can think of this as a meta-variable – it’s not part of your code, it’s about your code.
The alternate possibility is that the interpreter is reading a module that isn’t the main module – for example, when it reads a module that’s imported by the main module. In these cases, the
__name__ variable is set to the module name itself. So the
if statement will be
False, and the
main() function will never execute.
A quick example
__name__ in action, create a tiny module with a
main() function that just prints the module’s own
__name__ variable, then run it from the command line:
Next, create an equally tiny module that imports your first module and calls that same
So when you run
foo.py from the command line, its
'__main__'. When you import it, its
__name__ is simply
foo. If all that’s too much to take in, just absorb the short version and keep coding :)