{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import importlib\n", "\n", "import pathlib\n", "from types import ModuleType\n", "from typing import List\n", "from pathlib import Path\n", "\n", "from IPython.lib import deepreload" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "=============== Importing my_pkg ===============\n", "-------------- Importing motion.py ---------------\n", "===================== Done =====================\n" ] } ], "source": [ "import sys\n", "\n", "sys.path.insert(0, Path('apps/my_repo').resolve().as_posix())\n", "\n", "import my_pkg" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['importlib._abc',\n", " 'importlib._bootstrap',\n", " 'importlib._bootstrap_external',\n", " 'importlib._imp',\n", " 'importlib.abc',\n", " 'importlib.machinery',\n", " 'importlib.metadata',\n", " 'importlib.resources',\n", " 'importlib.sys',\n", " 'importlib.util',\n", " 'importlib.warnings']" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def recursive_modules(module_obj: ModuleType) -> List[str]:\n", " sub_modules = [\n", " f'{module_obj.__name__}.{name}' for name in dir(module_obj)\n", " if isinstance(getattr(module_obj, name), ModuleType)\n", " ]\n", " return sub_modules\n", "\n", "recursive_modules(importlib)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[, , , ]\n", "=============== Importing my_pkg ===============\n", "===================== Done =====================\n", "-------------- Importing motion.py ---------------\n" ] } ], "source": [ "def recursive_modules(module: ModuleType):\n", " for name in dir(module):\n", " sub_mod = getattr(module, name)\n", " if isinstance(sub_mod, ModuleType) and sub_mod.__name__.startswith(module.__name__):\n", " yield from recursive_modules(sub_mod)\n", " yield module\n", "\n", "\n", "def reload_package(pkg: ModuleType):\n", " modules = sorted(recursive_modules(pkg), key=lambda m: m.__name__)\n", " for mod in modules:\n", " importlib.reload(mod)\n", "\n", "\n", "reload_package(my_pkg)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "importlib.import_module(name)" ] } ], "metadata": { "kernelspec": { "display_name": "appdaemon", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.8" } }, "nbformat": 4, "nbformat_minor": 2 }