diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index c211b5234c..44d799e4ae 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -155,7 +155,7 @@ jobs: - name: Cache Data run: | ASPIREDIR=${{ env.WORK_DIR }} python -c \ - "import aspire; print(aspire.config['common']['cache_dir']); aspire.downloader.emdb_2660()" + "import aspire; print(aspire.config['common']['cache_dir']); import aspire.downloader; aspire.downloader.emdb_2660()" - name: Cleanup run: rm -rf ${{ env.WORK_DIR }} diff --git a/src/aspire/__init__.py b/src/aspire/__init__.py index fbb3ac2d2a..8e412fbab8 100644 --- a/src/aspire/__init__.py +++ b/src/aspire/__init__.py @@ -69,8 +69,18 @@ sys.excepthook = handle_exception +# Collect set of all module names in package +_modules = set(item[1] for item in pkgutil.iter_modules(aspire.__path__)) +# Automatically add modules __all__ = [] -for _, modname, _ in pkgutil.iter_modules(aspire.__path__): +for modname in _modules: __all__.append(modname) # Add module to __all_ - importlib.import_module(f"aspire.{modname}") # Import the module + + +# Dynamically load and return attributes +def __getattr__(attr): + if attr in _modules: + return importlib.import_module(f"aspire.{attr}") + else: + raise AttributeError(f"module `{__name__}` has no attribute `{attr}`.") diff --git a/src/aspire/utils/bot_align.py b/src/aspire/utils/bot_align.py index 68f6f9047c..fc8fbe4fdc 100644 --- a/src/aspire/utils/bot_align.py +++ b/src/aspire/utils/bot_align.py @@ -11,7 +11,6 @@ from numpy.linalg import norm from scipy.optimize import minimize -from aspire.operators import wemd_embed from aspire.utils.rotation import Rotation # Store parameters specific to each loss_type. @@ -64,6 +63,9 @@ def align_BO( Default `None` infers dtype from `vol_ref`. :return: Rotation matrix R_init (without refinement) or (R_init, R_est) (with refinement). """ + # Avoid utils/operators/utils circular import + from aspire.operators import wemd_embed + # Infer dtype dtype = np.dtype(dtype or vol_ref.dtype)