• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1:mod:`runpy` --- Locating and executing Python modules
2======================================================
3
4.. module:: runpy
5   :synopsis: Locate and run Python modules without importing them first.
6
7.. moduleauthor:: Nick Coghlan <ncoghlan@gmail.com>
8
9**Source code:** :source:`Lib/runpy.py`
10
11--------------
12
13The :mod:`runpy` module is used to locate and run Python modules without
14importing them first. Its main use is to implement the :option:`-m` command
15line switch that allows scripts to be located using the Python module
16namespace rather than the filesystem.
17
18Note that this is *not* a sandbox module - all code is executed in the
19current process, and any side effects (such as cached imports of other
20modules) will remain in place after the functions have returned.
21
22Furthermore, any functions and classes defined by the executed code are not
23guaranteed to work correctly after a :mod:`runpy` function has returned.
24If that limitation is not acceptable for a given use case, :mod:`importlib`
25is likely to be a more suitable choice than this module.
26
27The :mod:`runpy` module provides two functions:
28
29
30.. function:: run_module(mod_name, init_globals=None, run_name=None, alter_sys=False)
31
32   .. index::
33      module: __main__
34
35   Execute the code of the specified module and return the resulting module
36   globals dictionary. The module's code is first located using the standard
37   import mechanism (refer to :pep:`302` for details) and then executed in a
38   fresh module namespace.
39
40   The *mod_name* argument should be an absolute module name.
41   If the module name refers to a package rather than a normal
42   module, then that package is imported and the ``__main__`` submodule within
43   that package is then executed and the resulting module globals dictionary
44   returned.
45
46   The optional dictionary argument *init_globals* may be used to pre-populate
47   the module's globals dictionary before the code is executed. The supplied
48   dictionary will not be modified. If any of the special global variables
49   below are defined in the supplied dictionary, those definitions are
50   overridden by :func:`run_module`.
51
52   The special global variables ``__name__``, ``__spec__``, ``__file__``,
53   ``__cached__``, ``__loader__`` and ``__package__`` are set in the globals
54   dictionary before the module code is executed (Note that this is a
55   minimal set of variables - other variables may be set implicitly as an
56   interpreter implementation detail).
57
58   ``__name__`` is set to *run_name* if this optional argument is not
59   :const:`None`, to ``mod_name + '.__main__'`` if the named module is a
60   package and to the *mod_name* argument otherwise.
61
62   ``__spec__`` will be set appropriately for the *actually* imported
63   module (that is, ``__spec__.name`` will always be *mod_name* or
64   ``mod_name + '.__main__``, never *run_name*).
65
66   ``__file__``, ``__cached__``, ``__loader__`` and ``__package__`` are
67   :ref:`set as normal <import-mod-attrs>` based on the module spec.
68
69   If the argument *alter_sys* is supplied and evaluates to :const:`True`,
70   then ``sys.argv[0]`` is updated with the value of ``__file__`` and
71   ``sys.modules[__name__]`` is updated with a temporary module object for the
72   module being executed. Both ``sys.argv[0]`` and ``sys.modules[__name__]``
73   are restored to their original values before the function returns.
74
75   Note that this manipulation of :mod:`sys` is not thread-safe. Other threads
76   may see the partially initialised module, as well as the altered list of
77   arguments. It is recommended that the :mod:`sys` module be left alone when
78   invoking this function from threaded code.
79
80   .. seealso::
81      The :option:`-m` option offering equivalent functionality from the
82      command line.
83
84   .. versionchanged:: 3.1
85      Added ability to execute packages by looking for a ``__main__`` submodule.
86
87   .. versionchanged:: 3.2
88      Added ``__cached__`` global variable (see :pep:`3147`).
89
90   .. versionchanged:: 3.4
91      Updated to take advantage of the module spec feature added by
92      :pep:`451`. This allows ``__cached__`` to be set correctly for modules
93      run this way, as well as ensuring the real module name is always
94      accessible as ``__spec__.name``.
95
96.. function:: run_path(file_path, init_globals=None, run_name=None)
97
98   .. index::
99      module: __main__
100
101   Execute the code at the named filesystem location and return the resulting
102   module globals dictionary. As with a script name supplied to the CPython
103   command line, the supplied path may refer to a Python source file, a
104   compiled bytecode file or a valid sys.path entry containing a ``__main__``
105   module (e.g. a zipfile containing a top-level ``__main__.py`` file).
106
107   For a simple script, the specified code is simply executed in a fresh
108   module namespace. For a valid sys.path entry (typically a zipfile or
109   directory), the entry is first added to the beginning of ``sys.path``. The
110   function then looks for and executes a :mod:`__main__` module using the
111   updated path. Note that there is no special protection against invoking
112   an existing :mod:`__main__` entry located elsewhere on ``sys.path`` if
113   there is no such module at the specified location.
114
115   The optional dictionary argument *init_globals* may be used to pre-populate
116   the module's globals dictionary before the code is executed. The supplied
117   dictionary will not be modified. If any of the special global variables
118   below are defined in the supplied dictionary, those definitions are
119   overridden by :func:`run_path`.
120
121   The special global variables ``__name__``, ``__spec__``, ``__file__``,
122   ``__cached__``, ``__loader__`` and ``__package__`` are set in the globals
123   dictionary before the module code is executed (Note that this is a
124   minimal set of variables - other variables may be set implicitly as an
125   interpreter implementation detail).
126
127   ``__name__`` is set to *run_name* if this optional argument is not
128   :const:`None` and to ``'<run_path>'`` otherwise.
129
130   If the supplied path directly references a script file (whether as source
131   or as precompiled byte code), then ``__file__`` will be set to the
132   supplied path, and ``__spec__``, ``__cached__``, ``__loader__`` and
133   ``__package__`` will all be set to :const:`None`.
134
135   If the supplied path is a reference to a valid sys.path entry, then
136   ``__spec__`` will be set appropriately for the imported ``__main__``
137   module (that is, ``__spec__.name`` will always be ``__main__``).
138   ``__file__``, ``__cached__``, ``__loader__`` and ``__package__`` will be
139   :ref:`set as normal <import-mod-attrs>` based on the module spec.
140
141   A number of alterations are also made to the :mod:`sys` module. Firstly,
142   ``sys.path`` may be altered as described above. ``sys.argv[0]`` is updated
143   with the value of ``file_path`` and ``sys.modules[__name__]`` is updated
144   with a temporary module object for the module being executed. All
145   modifications to items in :mod:`sys` are reverted before the function
146   returns.
147
148   Note that, unlike :func:`run_module`, the alterations made to :mod:`sys`
149   are not optional in this function as these adjustments are essential to
150   allowing the execution of sys.path entries. As the thread-safety
151   limitations still apply, use of this function in threaded code should be
152   either serialised with the import lock or delegated to a separate process.
153
154   .. seealso::
155      :ref:`using-on-interface-options` for equivalent functionality on the
156      command line (``python path/to/script``).
157
158   .. versionadded:: 3.2
159
160   .. versionchanged:: 3.4
161      Updated to take advantage of the module spec feature added by
162      :pep:`451`. This allows ``__cached__`` to be set correctly in the
163      case where ``__main__`` is imported from a valid sys.path entry rather
164      than being executed directly.
165
166.. seealso::
167
168   :pep:`338` -- Executing modules as scripts
169      PEP written and implemented by Nick Coghlan.
170
171   :pep:`366` -- Main module explicit relative imports
172      PEP written and implemented by Nick Coghlan.
173
174   :pep:`451` -- A ModuleSpec Type for the Import System
175      PEP written and implemented by Eric Snow
176
177   :ref:`using-on-general` - CPython command line details
178
179   The :func:`importlib.import_module` function
180