tags:

views:

595

answers:

4

Should I start a Python program with:

if__name__ == '__main__':
some code...

And if so, why? I saw it many times but don't have a clue about it.

+14  A: 

If your program is usable as a library but you also have a main program (e.g. to test the library), that construct lets others import the file as a library and not run your main program. If your program is named foo.py and you do "import foo" from another python file, __name__ evaluates to 'foo', but if you run "python foo.py" from the command line, __name__ evaluates to '__main__'.

Note that you do need to insert a space between if and _, and indent the main program:

if __name__ == '__main__':
    main program here
Jouni K. Seppänen
+1: Reuse is important. A module can have 2 lives. As main program. As component in some other main program. As main program is DOES things. As component, it merely defines things.
S.Lott
This may go without saying, but be sure that this conditional goes at the end of your file.
Jeremy Cantrell
+3  A: 

This is good practice. First, it clearly marks your module entry point (assuming you don't have any other executable code at toplevel - yuck). Second, it makes your module importable by other modules without executing, which some tools like code checkers, packagers etc. need to do.

Rafał Dowgird
+15  A: 

A better pattern is this:

def main():
   ...

if __name__ == '__main__':
   main()

This allows your code to be invoked by someone who imported it, while also making programs such as pychecker and pylint work.

Charles Duffy
thank you! i was worried that the whole program had to be indented from the get go. I didin't like that.
J.J.
+12  A: 

Guido Van Rossum suggests:

def main(argv=None):
  if argv is None:
    argv = sys.argv
  ...

if __name__ == "__main__":
    sys.exit(main())

This way you can run main() from somewhere else (supplying the arguments), and if you want to exit with an error code just return 1 from main(), and it won't make an interactive interpreter exit by mistake.

orip
Perhaps ensure the example has a return value as outlined in the text?
Ali A
All functions have an implicit return value of None, which translates to an exit code of 0.
Jeremy Cantrell