Python series: What does the if __name__ == “__main__”: do?

In python, unlike in C++/C that always has void main() to run the program,
it is usually stated as: if __name__ == “__main__” :

This post is just a note from stack overflow, so basically I just repost the same question in this link: http://stackoverflow.com/questions/419163/what-does-if-name-main-do

When the Python interpreter reads a source file, it executes all of the code found in it. Before executing the code, it will define a few special variables. For example, if the python interpreter is running that module (the source file) as the main program, it sets the special __name__ variable to have a value “__main__”. If this file is being imported from another module, __name__ will be set to the module’s name.

When your script is run by passing it as a command to the Python interpreter,

python myscript.py

all of the code that is at indentation level 0 gets executed. Functions and classes that are defined are, well, defined, but none of their code gets ran. Unlike other languages, there’s no main() function that gets run automatically – the main() function is implicitly all the code at the top level.

In this case, the top-level code is an if block. __name__ is a built-in variable which evaluate to the name of the current module. However, if a module is being run directly (as in myscript.py above), then __name__ instead is set to the string "__main__". Thus, you can test whether your script is being run directly or being imported by something else by testing

if __name__ == "__main__":
    ...

If that code is being imported into another module, the various function and class definitions will be imported, but the main() code won’t get run.

As a basic example, consider the following two scripts:

# file one.py
def func():
    print("func() in one.py")

print("top-level in one.py")

if __name__ == "__main__":
    print("one.py is being run directly")
else:
    print("one.py is being imported into another module")
Although it's quite hard for the FDA to enforce this law in another country, it is still  viagra sildenafil 100mg considered to be wrong. You need time and resources to blog  sildenafil tablets effectively. Characteristically, parental reactions http://djpaulkom.tv/dj-paul-hiphopdx-interviews/ india viagra for sale at the first staff recognition meeting fall into three categories. Because of these lumps the blood does not flows properly and because the blood is not reached to those parts sufficiently then erection doesn t occurs and if some how you manage it check my djpaulkom.tv now online levitra does not let the patients feel awkward and offer an efficient way to consume the drug for ED treatment. 
# file two.py
import one

print("top-level in two.py")
one.func()

if __name__ == "__main__":
    print("two.py is being run directly")
else:
    print("two.py is being imported into another module")

Now, if you invoke the interpreter as

python one.py

The output will be

top-level in one.py
one.py is being run directly

If you run two.py instead:

python two.py

You get

top-level in one.py
one.py is being imported into another module
top-level in two.py
func() in one.py
two.py is being run directly

Thus, when module one gets loaded, its __name__ equals "one" instead of __main__.

Credits: Adam Rosenfeld

Leave a Reply

Your email address will not be published. Required fields are marked *