fix relative imports
Closely related to #45 (closed).
Consider the following setup:
MyIFO
|- __init__.py
|- ifo.yaml
\- something.py
where ifo.yaml
can just be copied from e.g. ALigo. __init__.py
looks like this:
from gwinc.ifo.noises import *
from . import something
class MyIFO(nb.Budget):
name = 'MyIFO'
noises = [
QuantumVacuum,
]
and something.py
is just
def test():
pass
Then, when in the directory immediately above MyIFO
, executing gwinc MyIFO
works as expected. However, moving one directory further up or sideways, so that a relative path becomes necessary (i.e. gwinc path/to/MyIFO
), this happens:
Traceback (most recent call last):
File "/usr/local/bin/gwinc", line 11, in <module>
load_entry_point('pygwinc', 'console_scripts', 'gwinc')()
File "/Users/sebastian/work/repos/coding/pygwinc/gwinc/__main__.py", line 100, in main
Budget = load_budget(args.IFO)
File "/Users/sebastian/work/repos/coding/pygwinc/gwinc/__init__.py", line 84, in load_budget
mod, modpath = _load_module(modname)
File "/Users/sebastian/work/repos/coding/pygwinc/gwinc/__init__.py", line 27, in _load_module
spec.loader.exec_module(mod)
File "<frozen importlib._bootstrap_external>", line 728, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "simulations/MyIFO/__init__.py", line 2, in <module>
from . import something
ModuleNotFoundError: No module named 'MyIFO'
This merge request fixes this by explicitly adding the module to sys.modules
in pygwinc's _load_module()
:
mod = importlib.util.module_from_spec(spec)
sys.modules[mod] = mod ### this line here, with matching "import sys" above
spec.loader.exec_module(mod)
See Python3 doc, which was apparently changed relatively recently to add exactly this line.
Edited by Sebastian Steinlechner