add option for delayed imports

will make setup checking easier, although it does not work for all cases
(from imports for example)

Change-Id: I2e5cf9b427a6f8e6f603d9662cdb9700d5f9ad9a
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/33893
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
Reviewed-by: Alexander Zaft <a.zaft@fz-juelich.de>
Reviewed-by: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de>
This commit is contained in:
Alexander Zaft
2024-06-10 14:05:51 +02:00
committed by Markus Zolliker
parent e093bdae96
commit 6837b82791
4 changed files with 33 additions and 14 deletions

View File

@@ -419,3 +419,26 @@ def merge_status(*args):
# use dict instead of set for preserving order
merged = {m: True for mm in merged for m in mm.split(', ')}
return maxcode, ', '.join(merged)
class _Raiser:
def __init__(self, modname):
self.modname = modname
def __getattr__(self, name):
# Just retry the import, it will give the most useful exception.
__import__(self.modname)
def __bool__(self):
return False
def delayed_import(modname):
"""Import a module, and return an object that raises a delayed exception
on access if it failed.
"""
try:
module = __import__(modname, None, None, ['*'])
except Exception:
return _Raiser(modname)
return module