I'm fussing over some details of relative imports while trying to mimic Python 
module loading in my personal project. This is getting more into corner cases, 
but I can spare time to talk about it while working on more normal stuff.

I first found this place:
https://manikos.github.io/how-pythons-import-machinery-works

And eventually just started looking at PEP 451. Neither is really explaining 
relative imports. I decided to try this garbage:

from importlib.util import spec_from_loader, module_from_spec
from importlib.machinery import SourceFileLoader
spec = spec_from_loader("..import_star", 
SourceFileLoader("package_test.import_star", 
r"C:\coding\random_python_projects\package_test\import_star.py"))
print(spec)
mod = module_from_spec(spec)
print(mod)
spec.loader.exec_module(mod)

...exec_module ultimately fails to do the job. Note the syntax so that I can 
actually perform a relative import hahaha:

C:\Python36\python.exe -m package_test.second_level.import_upwards
ModuleSpec(name='..import_star', 
loader=<_frozen_importlib_external.SourceFileLoader object at 
0x00000226E914B080>, origin='<unknown>')
<module '..import_star' from '<unknown>'>
Traceback (most recent call last):
  File "C:\Python36\lib\runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "C:\Python36\lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File 
"C:\coding\random_python_projects\package_test\second_level\import_upwards.py", 
line 15, in <module>
    spec.loader.exec_module(mod)
  File "<frozen importlib._bootstrap_external>", line 674, in exec_module
  File "<frozen importlib._bootstrap_external>", line 750, in get_code
  File "<frozen importlib._bootstrap_external>", line 398, in 
_check_name_wrapper
ImportError: loader for package_test.import_star cannot handle ..import_star


Yeah I don't think I'm doing this right! At this point I'm just trying to 
figure out where I feed in the relative path. Is that all deduced in advance of 
creating finding the spec? Can I even give the finders a relative path like 
that?
-- 
https://mail.python.org/mailman/listinfo/python-list

Reply via email to