Understanding the main method of python

This question already has an answer here:

  • What does if __name__ == “__main__”: do? 23 answers

  • The Python approach to "main" is almost unique to the language(*).

    The semantics are a bit subtle. The __name__ identifier is bound to the name of any module as it's being imported. However, when a file is being executed then __name__ is set to "__main__" (the literal string: __main__ ).

    This is almost always used to separate the portion of code which should be executed from the portions of code which define functionality. So Python code often contains a line like:

    #!/usr/bin/env python
    from __future__ import print_function
    import this, that, other, stuff
    class SomeObject(object):
        pass
    
    def some_function(*args,**kwargs):
        pass
    
    if __name__ == '__main__':
        print("This only executes when %s is executed rather than imported" % __file__)
    

    Using this convention one can have a file define classes and functions for use in other programs, and also include code to evaluate only when the file is called as a standalone script.

    It's important to understand that all of the code above the if __name__ line is being executed, evaluated, in both cases. It's evaluated by the interpreter when the file is imported or when it's executed. If you put a print statement before the if __name__ line then it will print output every time any other code attempts to import that as a module. (Of course, this would be anti-social . Don't do that).

    I, personally, like these semantics. It encourages programmers to separate functionality (definitions) from function (execution) and encourages re-use.

    Ideally almost every Python module can do something useful if called from the command line. In many cases this is used for managing unit tests. If a particular file defines functionality which is only useful in the context of other components of a system then one can still use __name__ == "__main__" to isolate a block of code which calls a suite of unit tests that apply to this module.

    (If you're not going to have any such functionality nor unit tests than it's best to ensure that the file mode is NOT executable).

    Summary: if __name__ == '__main__': has two primary use cases:

  • Allow a module to provide functionality for import into other code while also providing useful semantics as a standalone script (a command line wrapper around the functionality)
  • Allow a module to define a suite of unit tests which are stored with (in the same file as) the code to be tested and which can be executed independently of the rest of the codebase.
  • It's fairly common to def main(*args) and have if __name__ == '__main__': simply call main(*sys.argv[1:]) if you want to define main in a manner that's similar to some other programming languages. If your .py file is primarily intended to be used as a module in other code then you might def test_module() and calling test_module() in your if __name__ == '__main__:' suite.

  • (Ruby also implements a similar feature if __file__ == $0 ).

  • In Python, execution does NOT have to begin at main. The first line of "executable code" is executed first.

    def main():
        print("main code")
    
    def meth1():
        print("meth1")
    
    meth1()
    if __name__ == "__main__":main() ## with if
    

    Output -

    meth1
    main code
    

    More on main() - http://ibiblio.org/g2swap/byteofpython/read/module-name.html

    A module's __name__

    Every module has a name and statements in a module can find out the name of its module. This is especially handy in one particular situation - As mentioned previously, when a module is imported for the first time, the main block in that module is run. What if we want to run the block only if the program was used by itself and not when it was imported from another module? This can be achieved using the name attribute of the module.

    Using a module's __name__

    #!/usr/bin/python
    # Filename: using_name.py
    
    if __name__ == '__main__':
        print 'This program is being run by itself'
    else:
        print 'I am being imported from another module'
    

    Output -

    $ python using_name.py
    This program is being run by itself
    $ python
    >>> import using_name
    I am being imported from another module
    >>>
    

    How It Works -

    Every Python module has it's __name__ defined and if this is __main__ , it implies that the module is being run standalone by the user and we can do corresponding appropriate actions.


    Python does not have a defined entry point like Java, C, C++, etc. Rather it simply executes a source file line-by-line. The if statement allows you to create a main function which will be executed if your file is loaded as the "Main" module rather than as a library in another module.

    链接地址: http://www.djcxy.com/p/9310.html

    上一篇: “if name ==”是什么

    下一篇: 了解python的主要方法