diff options
author | Chris Barker <Chris.Barker@noaa.gov> | 2024-09-13 23:36:40 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-13 23:36:40 (GMT) |
commit | 38809171b8768517824fb62d48abe2cb0aff8429 (patch) | |
tree | 6e3b691a518adeb9504bdcfdab653b8ca54f5cb3 /Doc | |
parent | cd06f5e32369c7816c7360cbb20fbe9f38b4f3a7 (diff) | |
download | cpython-38809171b8768517824fb62d48abe2cb0aff8429.zip cpython-38809171b8768517824fb62d48abe2cb0aff8429.tar.gz cpython-38809171b8768517824fb62d48abe2cb0aff8429.tar.bz2 |
gh-121607: Edited source file import recipe to make it more clear (#121519)
Co-authored-by: Brett Cannon <brett@python.org>
Co-authored-by: Peter Bierma <zintensitydev@gmail.com>
Diffstat (limited to 'Doc')
-rw-r--r-- | Doc/library/importlib.rst | 37 |
1 files changed, 25 insertions, 12 deletions
diff --git a/Doc/library/importlib.rst b/Doc/library/importlib.rst index 1206a2d..d0a3d9d 100644 --- a/Doc/library/importlib.rst +++ b/Doc/library/importlib.rst @@ -1584,20 +1584,34 @@ Note that if ``name`` is a submodule (contains a dot), Importing a source file directly '''''''''''''''''''''''''''''''' -To import a Python source file directly, use the following recipe:: +This recipe should be used with caution: it is an approximation of an import +statement where the file path is specified directly, rather than +:data:`sys.path` being searched. Alternatives should first be considered first, +such as modifying :data:`sys.path` when a proper module is required, or using +:func:`runpy.run_path` when the global namespace resulting from running a Python +file is appropriate. - import importlib.util - import sys +To import a Python source file directly from a path, use the following recipe:: + + import importlib.util + import sys - # For illustrative purposes. - import tokenize - file_path = tokenize.__file__ - module_name = tokenize.__name__ - spec = importlib.util.spec_from_file_location(module_name, file_path) - module = importlib.util.module_from_spec(spec) - sys.modules[module_name] = module - spec.loader.exec_module(module) + def import_from_path(module_name, file_path): + spec = importlib.util.spec_from_file_location(module_name, file_path) + module = importlib.util.module_from_spec(spec) + sys.modules[module_name] = module + spec.loader.exec_module(module) + return module + + + # For illustrative purposes only (use of `json` is arbitrary). + import json + file_path = json.__file__ + module_name = json.__name__ + + # Similar outcome as `import json`. + json = import_from_path(module_name, file_path) Implementing lazy imports @@ -1623,7 +1637,6 @@ The example below shows how to implement lazy imports:: False - Setting up an importer '''''''''''''''''''''' |