17db96d56Sopenharmony_ci:mod:`__main__` --- Top-level code environment 27db96d56Sopenharmony_ci============================================== 37db96d56Sopenharmony_ci 47db96d56Sopenharmony_ci.. module:: __main__ 57db96d56Sopenharmony_ci :synopsis: The environment where top-level code is run. Covers command-line 67db96d56Sopenharmony_ci interfaces, import-time behavior, and ``__name__ == '__main__'``. 77db96d56Sopenharmony_ci 87db96d56Sopenharmony_ci-------------- 97db96d56Sopenharmony_ci 107db96d56Sopenharmony_ciIn Python, the special name ``__main__`` is used for two important constructs: 117db96d56Sopenharmony_ci 127db96d56Sopenharmony_ci1. the name of the top-level environment of the program, which can be 137db96d56Sopenharmony_ci checked using the ``__name__ == '__main__'`` expression; and 147db96d56Sopenharmony_ci2. the ``__main__.py`` file in Python packages. 157db96d56Sopenharmony_ci 167db96d56Sopenharmony_ciBoth of these mechanisms are related to Python modules; how users interact with 177db96d56Sopenharmony_cithem and how they interact with each other. They are explained in detail 187db96d56Sopenharmony_cibelow. If you're new to Python modules, see the tutorial section 197db96d56Sopenharmony_ci:ref:`tut-modules` for an introduction. 207db96d56Sopenharmony_ci 217db96d56Sopenharmony_ci 227db96d56Sopenharmony_ci.. _name_equals_main: 237db96d56Sopenharmony_ci 247db96d56Sopenharmony_ci``__name__ == '__main__'`` 257db96d56Sopenharmony_ci--------------------------- 267db96d56Sopenharmony_ci 277db96d56Sopenharmony_ciWhen a Python module or package is imported, ``__name__`` is set to the 287db96d56Sopenharmony_cimodule's name. Usually, this is the name of the Python file itself without the 297db96d56Sopenharmony_ci``.py`` extension:: 307db96d56Sopenharmony_ci 317db96d56Sopenharmony_ci >>> import configparser 327db96d56Sopenharmony_ci >>> configparser.__name__ 337db96d56Sopenharmony_ci 'configparser' 347db96d56Sopenharmony_ci 357db96d56Sopenharmony_ciIf the file is part of a package, ``__name__`` will also include the parent 367db96d56Sopenharmony_cipackage's path:: 377db96d56Sopenharmony_ci 387db96d56Sopenharmony_ci >>> from concurrent.futures import process 397db96d56Sopenharmony_ci >>> process.__name__ 407db96d56Sopenharmony_ci 'concurrent.futures.process' 417db96d56Sopenharmony_ci 427db96d56Sopenharmony_ciHowever, if the module is executed in the top-level code environment, 437db96d56Sopenharmony_ciits ``__name__`` is set to the string ``'__main__'``. 447db96d56Sopenharmony_ci 457db96d56Sopenharmony_ciWhat is the "top-level code environment"? 467db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 477db96d56Sopenharmony_ci 487db96d56Sopenharmony_ci``__main__`` is the name of the environment where top-level code is run. 497db96d56Sopenharmony_ci"Top-level code" is the first user-specified Python module that starts running. 507db96d56Sopenharmony_ciIt's "top-level" because it imports all other modules that the program needs. 517db96d56Sopenharmony_ciSometimes "top-level code" is called an *entry point* to the application. 527db96d56Sopenharmony_ci 537db96d56Sopenharmony_ciThe top-level code environment can be: 547db96d56Sopenharmony_ci 557db96d56Sopenharmony_ci* the scope of an interactive prompt:: 567db96d56Sopenharmony_ci 577db96d56Sopenharmony_ci >>> __name__ 587db96d56Sopenharmony_ci '__main__' 597db96d56Sopenharmony_ci 607db96d56Sopenharmony_ci* the Python module passed to the Python interpreter as a file argument: 617db96d56Sopenharmony_ci 627db96d56Sopenharmony_ci .. code-block:: shell-session 637db96d56Sopenharmony_ci 647db96d56Sopenharmony_ci $ python3 helloworld.py 657db96d56Sopenharmony_ci Hello, world! 667db96d56Sopenharmony_ci 677db96d56Sopenharmony_ci* the Python module or package passed to the Python interpreter with the 687db96d56Sopenharmony_ci :option:`-m` argument: 697db96d56Sopenharmony_ci 707db96d56Sopenharmony_ci .. code-block:: shell-session 717db96d56Sopenharmony_ci 727db96d56Sopenharmony_ci $ python3 -m tarfile 737db96d56Sopenharmony_ci usage: tarfile.py [-h] [-v] (...) 747db96d56Sopenharmony_ci 757db96d56Sopenharmony_ci* Python code read by the Python interpreter from standard input: 767db96d56Sopenharmony_ci 777db96d56Sopenharmony_ci .. code-block:: shell-session 787db96d56Sopenharmony_ci 797db96d56Sopenharmony_ci $ echo "import this" | python3 807db96d56Sopenharmony_ci The Zen of Python, by Tim Peters 817db96d56Sopenharmony_ci 827db96d56Sopenharmony_ci Beautiful is better than ugly. 837db96d56Sopenharmony_ci Explicit is better than implicit. 847db96d56Sopenharmony_ci ... 857db96d56Sopenharmony_ci 867db96d56Sopenharmony_ci* Python code passed to the Python interpreter with the :option:`-c` argument: 877db96d56Sopenharmony_ci 887db96d56Sopenharmony_ci .. code-block:: shell-session 897db96d56Sopenharmony_ci 907db96d56Sopenharmony_ci $ python3 -c "import this" 917db96d56Sopenharmony_ci The Zen of Python, by Tim Peters 927db96d56Sopenharmony_ci 937db96d56Sopenharmony_ci Beautiful is better than ugly. 947db96d56Sopenharmony_ci Explicit is better than implicit. 957db96d56Sopenharmony_ci ... 967db96d56Sopenharmony_ci 977db96d56Sopenharmony_ciIn each of these situations, the top-level module's ``__name__`` is set to 987db96d56Sopenharmony_ci``'__main__'``. 997db96d56Sopenharmony_ci 1007db96d56Sopenharmony_ciAs a result, a module can discover whether or not it is running in the 1017db96d56Sopenharmony_citop-level environment by checking its own ``__name__``, which allows a common 1027db96d56Sopenharmony_ciidiom for conditionally executing code when the module is not initialized from 1037db96d56Sopenharmony_cian import statement:: 1047db96d56Sopenharmony_ci 1057db96d56Sopenharmony_ci if __name__ == '__main__': 1067db96d56Sopenharmony_ci # Execute when the module is not initialized from an import statement. 1077db96d56Sopenharmony_ci ... 1087db96d56Sopenharmony_ci 1097db96d56Sopenharmony_ci.. seealso:: 1107db96d56Sopenharmony_ci 1117db96d56Sopenharmony_ci For a more detailed look at how ``__name__`` is set in all situations, see 1127db96d56Sopenharmony_ci the tutorial section :ref:`tut-modules`. 1137db96d56Sopenharmony_ci 1147db96d56Sopenharmony_ci 1157db96d56Sopenharmony_ciIdiomatic Usage 1167db96d56Sopenharmony_ci^^^^^^^^^^^^^^^ 1177db96d56Sopenharmony_ci 1187db96d56Sopenharmony_ciSome modules contain code that is intended for script use only, like parsing 1197db96d56Sopenharmony_cicommand-line arguments or fetching data from standard input. If a module 1207db96d56Sopenharmony_cilike this was imported from a different module, for example to unit test 1217db96d56Sopenharmony_ciit, the script code would unintentionally execute as well. 1227db96d56Sopenharmony_ci 1237db96d56Sopenharmony_ciThis is where using the ``if __name__ == '__main__'`` code block comes in 1247db96d56Sopenharmony_cihandy. Code within this block won't run unless the module is executed in the 1257db96d56Sopenharmony_citop-level environment. 1267db96d56Sopenharmony_ci 1277db96d56Sopenharmony_ciPutting as few statements as possible in the block below ``if __name__ == 1287db96d56Sopenharmony_ci'__main__'`` can improve code clarity and correctness. Most often, a function 1297db96d56Sopenharmony_cinamed ``main`` encapsulates the program's primary behavior:: 1307db96d56Sopenharmony_ci 1317db96d56Sopenharmony_ci # echo.py 1327db96d56Sopenharmony_ci 1337db96d56Sopenharmony_ci import shlex 1347db96d56Sopenharmony_ci import sys 1357db96d56Sopenharmony_ci 1367db96d56Sopenharmony_ci def echo(phrase: str) -> None: 1377db96d56Sopenharmony_ci """A dummy wrapper around print.""" 1387db96d56Sopenharmony_ci # for demonstration purposes, you can imagine that there is some 1397db96d56Sopenharmony_ci # valuable and reusable logic inside this function 1407db96d56Sopenharmony_ci print(phrase) 1417db96d56Sopenharmony_ci 1427db96d56Sopenharmony_ci def main() -> int: 1437db96d56Sopenharmony_ci """Echo the input arguments to standard output""" 1447db96d56Sopenharmony_ci phrase = shlex.join(sys.argv) 1457db96d56Sopenharmony_ci echo(phrase) 1467db96d56Sopenharmony_ci return 0 1477db96d56Sopenharmony_ci 1487db96d56Sopenharmony_ci if __name__ == '__main__': 1497db96d56Sopenharmony_ci sys.exit(main()) # next section explains the use of sys.exit 1507db96d56Sopenharmony_ci 1517db96d56Sopenharmony_ciNote that if the module didn't encapsulate code inside the ``main`` function 1527db96d56Sopenharmony_cibut instead put it directly within the ``if __name__ == '__main__'`` block, 1537db96d56Sopenharmony_cithe ``phrase`` variable would be global to the entire module. This is 1547db96d56Sopenharmony_cierror-prone as other functions within the module could be unintentionally using 1557db96d56Sopenharmony_cithe global variable instead of a local name. A ``main`` function solves this 1567db96d56Sopenharmony_ciproblem. 1577db96d56Sopenharmony_ci 1587db96d56Sopenharmony_ciUsing a ``main`` function has the added benefit of the ``echo`` function itself 1597db96d56Sopenharmony_cibeing isolated and importable elsewhere. When ``echo.py`` is imported, the 1607db96d56Sopenharmony_ci``echo`` and ``main`` functions will be defined, but neither of them will be 1617db96d56Sopenharmony_cicalled, because ``__name__ != '__main__'``. 1627db96d56Sopenharmony_ci 1637db96d56Sopenharmony_ci 1647db96d56Sopenharmony_ciPackaging Considerations 1657db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^ 1667db96d56Sopenharmony_ci 1677db96d56Sopenharmony_ci``main`` functions are often used to create command-line tools by specifying 1687db96d56Sopenharmony_cithem as entry points for console scripts. When this is done, 1697db96d56Sopenharmony_ci`pip <https://pip.pypa.io/>`_ inserts the function call into a template script, 1707db96d56Sopenharmony_ciwhere the return value of ``main`` is passed into :func:`sys.exit`. 1717db96d56Sopenharmony_ciFor example:: 1727db96d56Sopenharmony_ci 1737db96d56Sopenharmony_ci sys.exit(main()) 1747db96d56Sopenharmony_ci 1757db96d56Sopenharmony_ciSince the call to ``main`` is wrapped in :func:`sys.exit`, the expectation is 1767db96d56Sopenharmony_cithat your function will return some value acceptable as an input to 1777db96d56Sopenharmony_ci:func:`sys.exit`; typically, an integer or ``None`` (which is implicitly 1787db96d56Sopenharmony_cireturned if your function does not have a return statement). 1797db96d56Sopenharmony_ci 1807db96d56Sopenharmony_ciBy proactively following this convention ourselves, our module will have the 1817db96d56Sopenharmony_cisame behavior when run directly (i.e. ``python3 echo.py``) as it will have if 1827db96d56Sopenharmony_ciwe later package it as a console script entry-point in a pip-installable 1837db96d56Sopenharmony_cipackage. 1847db96d56Sopenharmony_ci 1857db96d56Sopenharmony_ciIn particular, be careful about returning strings from your ``main`` function. 1867db96d56Sopenharmony_ci:func:`sys.exit` will interpret a string argument as a failure message, so 1877db96d56Sopenharmony_ciyour program will have an exit code of ``1``, indicating failure, and the 1887db96d56Sopenharmony_cistring will be written to :data:`sys.stderr`. The ``echo.py`` example from 1897db96d56Sopenharmony_ciearlier exemplifies using the ``sys.exit(main())`` convention. 1907db96d56Sopenharmony_ci 1917db96d56Sopenharmony_ci.. seealso:: 1927db96d56Sopenharmony_ci 1937db96d56Sopenharmony_ci `Python Packaging User Guide <https://packaging.python.org/>`_ 1947db96d56Sopenharmony_ci contains a collection of tutorials and references on how to distribute and 1957db96d56Sopenharmony_ci install Python packages with modern tools. 1967db96d56Sopenharmony_ci 1977db96d56Sopenharmony_ci 1987db96d56Sopenharmony_ci``__main__.py`` in Python Packages 1997db96d56Sopenharmony_ci---------------------------------- 2007db96d56Sopenharmony_ci 2017db96d56Sopenharmony_ciIf you are not familiar with Python packages, see section :ref:`tut-packages` 2027db96d56Sopenharmony_ciof the tutorial. Most commonly, the ``__main__.py`` file is used to provide 2037db96d56Sopenharmony_cia command-line interface for a package. Consider the following hypothetical 2047db96d56Sopenharmony_cipackage, "bandclass": 2057db96d56Sopenharmony_ci 2067db96d56Sopenharmony_ci.. code-block:: text 2077db96d56Sopenharmony_ci 2087db96d56Sopenharmony_ci bandclass 2097db96d56Sopenharmony_ci ├── __init__.py 2107db96d56Sopenharmony_ci ├── __main__.py 2117db96d56Sopenharmony_ci └── student.py 2127db96d56Sopenharmony_ci 2137db96d56Sopenharmony_ci``__main__.py`` will be executed when the package itself is invoked 2147db96d56Sopenharmony_cidirectly from the command line using the :option:`-m` flag. For example: 2157db96d56Sopenharmony_ci 2167db96d56Sopenharmony_ci.. code-block:: shell-session 2177db96d56Sopenharmony_ci 2187db96d56Sopenharmony_ci $ python3 -m bandclass 2197db96d56Sopenharmony_ci 2207db96d56Sopenharmony_ciThis command will cause ``__main__.py`` to run. How you utilize this mechanism 2217db96d56Sopenharmony_ciwill depend on the nature of the package you are writing, but in this 2227db96d56Sopenharmony_cihypothetical case, it might make sense to allow the teacher to search for 2237db96d56Sopenharmony_cistudents:: 2247db96d56Sopenharmony_ci 2257db96d56Sopenharmony_ci # bandclass/__main__.py 2267db96d56Sopenharmony_ci 2277db96d56Sopenharmony_ci import sys 2287db96d56Sopenharmony_ci from .student import search_students 2297db96d56Sopenharmony_ci 2307db96d56Sopenharmony_ci student_name = sys.argv[2] if len(sys.argv) >= 2 else '' 2317db96d56Sopenharmony_ci print(f'Found student: {search_students(student_name)}') 2327db96d56Sopenharmony_ci 2337db96d56Sopenharmony_ciNote that ``from .student import search_students`` is an example of a relative 2347db96d56Sopenharmony_ciimport. This import style can be used when referencing modules within a 2357db96d56Sopenharmony_cipackage. For more details, see :ref:`intra-package-references` in the 2367db96d56Sopenharmony_ci:ref:`tut-modules` section of the tutorial. 2377db96d56Sopenharmony_ci 2387db96d56Sopenharmony_ciIdiomatic Usage 2397db96d56Sopenharmony_ci^^^^^^^^^^^^^^^ 2407db96d56Sopenharmony_ci 2417db96d56Sopenharmony_ciThe contents of ``__main__.py`` typically isn't fenced with 2427db96d56Sopenharmony_ci``if __name__ == '__main__'`` blocks. Instead, those files are kept short, 2437db96d56Sopenharmony_cifunctions to execute from other modules. Those other modules can then be 2447db96d56Sopenharmony_cieasily unit-tested and are properly reusable. 2457db96d56Sopenharmony_ci 2467db96d56Sopenharmony_ciIf used, an ``if __name__ == '__main__'`` block will still work as expected 2477db96d56Sopenharmony_cifor a ``__main__.py`` file within a package, because its ``__name__`` 2487db96d56Sopenharmony_ciattribute will include the package's path if imported:: 2497db96d56Sopenharmony_ci 2507db96d56Sopenharmony_ci >>> import asyncio.__main__ 2517db96d56Sopenharmony_ci >>> asyncio.__main__.__name__ 2527db96d56Sopenharmony_ci 'asyncio.__main__' 2537db96d56Sopenharmony_ci 2547db96d56Sopenharmony_ciThis won't work for ``__main__.py`` files in the root directory of a .zip file 2557db96d56Sopenharmony_cithough. Hence, for consistency, minimal ``__main__.py`` like the :mod:`venv` 2567db96d56Sopenharmony_cione mentioned below are preferred. 2577db96d56Sopenharmony_ci 2587db96d56Sopenharmony_ci.. seealso:: 2597db96d56Sopenharmony_ci 2607db96d56Sopenharmony_ci See :mod:`venv` for an example of a package with a minimal ``__main__.py`` 2617db96d56Sopenharmony_ci in the standard library. It doesn't contain a ``if __name__ == '__main__'`` 2627db96d56Sopenharmony_ci block. You can invoke it with ``python -m venv [directory]``. 2637db96d56Sopenharmony_ci 2647db96d56Sopenharmony_ci See :mod:`runpy` for more details on the :option:`-m` flag to the 2657db96d56Sopenharmony_ci interpreter executable. 2667db96d56Sopenharmony_ci 2677db96d56Sopenharmony_ci See :mod:`zipapp` for how to run applications packaged as *.zip* files. In 2687db96d56Sopenharmony_ci this case Python looks for a ``__main__.py`` file in the root directory of 2697db96d56Sopenharmony_ci the archive. 2707db96d56Sopenharmony_ci 2717db96d56Sopenharmony_ci 2727db96d56Sopenharmony_ci 2737db96d56Sopenharmony_ci``import __main__`` 2747db96d56Sopenharmony_ci------------------- 2757db96d56Sopenharmony_ci 2767db96d56Sopenharmony_ciRegardless of which module a Python program was started with, other modules 2777db96d56Sopenharmony_cirunning within that same program can import the top-level environment's scope 2787db96d56Sopenharmony_ci(:term:`namespace`) by importing the ``__main__`` module. This doesn't import 2797db96d56Sopenharmony_cia ``__main__.py`` file but rather whichever module that received the special 2807db96d56Sopenharmony_ciname ``'__main__'``. 2817db96d56Sopenharmony_ci 2827db96d56Sopenharmony_ciHere is an example module that consumes the ``__main__`` namespace:: 2837db96d56Sopenharmony_ci 2847db96d56Sopenharmony_ci # namely.py 2857db96d56Sopenharmony_ci 2867db96d56Sopenharmony_ci import __main__ 2877db96d56Sopenharmony_ci 2887db96d56Sopenharmony_ci def did_user_define_their_name(): 2897db96d56Sopenharmony_ci return 'my_name' in dir(__main__) 2907db96d56Sopenharmony_ci 2917db96d56Sopenharmony_ci def print_user_name(): 2927db96d56Sopenharmony_ci if not did_user_define_their_name(): 2937db96d56Sopenharmony_ci raise ValueError('Define the variable `my_name`!') 2947db96d56Sopenharmony_ci 2957db96d56Sopenharmony_ci if '__file__' in dir(__main__): 2967db96d56Sopenharmony_ci print(__main__.my_name, "found in file", __main__.__file__) 2977db96d56Sopenharmony_ci else: 2987db96d56Sopenharmony_ci print(__main__.my_name) 2997db96d56Sopenharmony_ci 3007db96d56Sopenharmony_ciExample usage of this module could be as follows:: 3017db96d56Sopenharmony_ci 3027db96d56Sopenharmony_ci # start.py 3037db96d56Sopenharmony_ci 3047db96d56Sopenharmony_ci import sys 3057db96d56Sopenharmony_ci 3067db96d56Sopenharmony_ci from namely import print_user_name 3077db96d56Sopenharmony_ci 3087db96d56Sopenharmony_ci # my_name = "Dinsdale" 3097db96d56Sopenharmony_ci 3107db96d56Sopenharmony_ci def main(): 3117db96d56Sopenharmony_ci try: 3127db96d56Sopenharmony_ci print_user_name() 3137db96d56Sopenharmony_ci except ValueError as ve: 3147db96d56Sopenharmony_ci return str(ve) 3157db96d56Sopenharmony_ci 3167db96d56Sopenharmony_ci if __name__ == "__main__": 3177db96d56Sopenharmony_ci sys.exit(main()) 3187db96d56Sopenharmony_ci 3197db96d56Sopenharmony_ciNow, if we started our program, the result would look like this: 3207db96d56Sopenharmony_ci 3217db96d56Sopenharmony_ci.. code-block:: shell-session 3227db96d56Sopenharmony_ci 3237db96d56Sopenharmony_ci $ python3 start.py 3247db96d56Sopenharmony_ci Define the variable `my_name`! 3257db96d56Sopenharmony_ci 3267db96d56Sopenharmony_ciThe exit code of the program would be 1, indicating an error. Uncommenting the 3277db96d56Sopenharmony_ciline with ``my_name = "Dinsdale"`` fixes the program and now it exits with 3287db96d56Sopenharmony_cistatus code 0, indicating success: 3297db96d56Sopenharmony_ci 3307db96d56Sopenharmony_ci.. code-block:: shell-session 3317db96d56Sopenharmony_ci 3327db96d56Sopenharmony_ci $ python3 start.py 3337db96d56Sopenharmony_ci Dinsdale found in file /path/to/start.py 3347db96d56Sopenharmony_ci 3357db96d56Sopenharmony_ciNote that importing ``__main__`` doesn't cause any issues with unintentionally 3367db96d56Sopenharmony_cirunning top-level code meant for script use which is put in the 3377db96d56Sopenharmony_ci``if __name__ == "__main__"`` block of the ``start`` module. Why does this work? 3387db96d56Sopenharmony_ci 3397db96d56Sopenharmony_ciPython inserts an empty ``__main__`` module in :attr:`sys.modules` at 3407db96d56Sopenharmony_ciinterpreter startup, and populates it by running top-level code. In our example 3417db96d56Sopenharmony_cithis is the ``start`` module which runs line by line and imports ``namely``. 3427db96d56Sopenharmony_ciIn turn, ``namely`` imports ``__main__`` (which is really ``start``). That's an 3437db96d56Sopenharmony_ciimport cycle! Fortunately, since the partially populated ``__main__`` 3447db96d56Sopenharmony_cimodule is present in :attr:`sys.modules`, Python passes that to ``namely``. 3457db96d56Sopenharmony_ciSee :ref:`Special considerations for __main__ <import-dunder-main>` in the 3467db96d56Sopenharmony_ciimport system's reference for details on how this works. 3477db96d56Sopenharmony_ci 3487db96d56Sopenharmony_ciThe Python REPL is another example of a "top-level environment", so anything 3497db96d56Sopenharmony_cidefined in the REPL becomes part of the ``__main__`` scope:: 3507db96d56Sopenharmony_ci 3517db96d56Sopenharmony_ci >>> import namely 3527db96d56Sopenharmony_ci >>> namely.did_user_define_their_name() 3537db96d56Sopenharmony_ci False 3547db96d56Sopenharmony_ci >>> namely.print_user_name() 3557db96d56Sopenharmony_ci Traceback (most recent call last): 3567db96d56Sopenharmony_ci ... 3577db96d56Sopenharmony_ci ValueError: Define the variable `my_name`! 3587db96d56Sopenharmony_ci >>> my_name = 'Jabberwocky' 3597db96d56Sopenharmony_ci >>> namely.did_user_define_their_name() 3607db96d56Sopenharmony_ci True 3617db96d56Sopenharmony_ci >>> namely.print_user_name() 3627db96d56Sopenharmony_ci Jabberwocky 3637db96d56Sopenharmony_ci 3647db96d56Sopenharmony_ciNote that in this case the ``__main__`` scope doesn't contain a ``__file__`` 3657db96d56Sopenharmony_ciattribute as it's interactive. 3667db96d56Sopenharmony_ci 3677db96d56Sopenharmony_ciThe ``__main__`` scope is used in the implementation of :mod:`pdb` and 3687db96d56Sopenharmony_ci:mod:`rlcompleter`. 369