Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
33 changes: 21 additions & 12 deletions Doc/library/importlib.rst
Original file line number Diff line number Diff line change
Expand Up @@ -1584,20 +1584,30 @@ 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 `sys.path` being searched.
Alternatives should first be considered, such as modifying `sys.path` when a proper module is required, or using `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)
Comment on lines +1609 to +1614
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I included this example because there had been a similar one in the previous version.

However, it is (always?) a bad idea to use this recipe to import a module on sys.path, particularly an stdlib one -- so maybe better to simply not provide a runnable example?

I expect the code itself is clear enough on how it can be used.



Implementing lazy imports
Expand All @@ -1623,7 +1633,6 @@ The example below shows how to implement lazy imports::
False



Setting up an importer
''''''''''''''''''''''

Expand Down