fix relative imports
Compare changes
+ 2
− 0
@@ -22,6 +23,7 @@ def _load_module(name_or_path):
Maintenance will be performed on git.ligo.org, containers.ligo.org, and docs.ligo.org on Tuesday 25 March 2025 starting at approximately 8:30am PDT. It is expected to take around 30 minutes and there will be several periods of downtime throughout the maintenance. Please address any comments, concerns, or questions to the helpdesk.
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.