import importlib
module_name = "my_module" # Имя модуля для импорта (строка)
try:
    my_module = importlib.import_module(module_name)
    # Теперь можно использовать my_module
    print(my_module.my_function()) # Пример вызова функции из модуля
except ImportError as e:
    print(f"Ошибка импорта модуля {module_name}: {e}")
except AttributeError as e:
    print(f"Ошибка при обращении к атрибуту модуля {module_name}: {e}")
  Модуль importlib в Python предоставляет инструменты для динамического импорта модулей во время выполнения программы. Это особенно полезно, когда имя модуля или его местоположение не известно во время написания кода, а определяется, например, из конфигурационного файла или вводится пользователем.
Основные функции для динамического импорта:
importlib.import_module(name, package=None): Самый распространенный способ динамического импорта. name - это строка с именем модуля для импорта.  package - это необязательный аргумент, используемый при импорте относительных модулей.  Функция возвращает импортированный модуль.
    importlib.util.spec_from_file_location(name, location, submodule_search_locations=None, loader=None, is_package=None):  Позволяет создать спецификацию модуля на основе пути к файлу. Полезно, когда модуль не находится в стандартных путях поиска модулей (sys.path).
    importlib.util.module_from_spec(spec): Создает пустой модуль на основе заданной спецификации (spec).
    loader.exec_module(module):  Выполняет код модуля в пространстве имен созданного модуля.  loader - это объект загрузчика, который можно получить из спецификации.
    Примеры:
1. Импорт модуля по имени:
  import importlib
  module_name = "math"
  try:
      math_module = importlib.import_module(module_name)
      print(f"Модуль {module_name} успешно импортирован.")
      print(math_module.sqrt(16)) # Пример использования функции из импортированного модуля
  except ModuleNotFoundError:
      print(f"Модуль {module_name} не найден.")
  except Exception as e:
      print(f"Произошла ошибка при импорте модуля: {e}")
  2. Импорт модуля из файла (нестандартное расположение):
  import importlib.util
  import importlib.machinery
  import sys
  module_name = "my_module" # Предположим, что это название файла my_module.py
  module_path = "/path/to/your/module/my_module.py" # Замените на фактический путь
  try:
      spec = importlib.util.spec_from_file_location(module_name, module_path)
      if spec is None:
          print(f"Спецификация для модуля {module_name} не найдена.  Проверьте путь к файлу.")
      else:
          module = importlib.util.module_from_spec(spec)
          sys.modules[module_name] = module # Важно: добавить модуль в sys.modules
          loader = importlib.machinery.SourceFileLoader(module_name, module_path)
          spec.loader = loader
          loader.exec_module(module)
          print(f"Модуль {module_name} успешно импортирован из {module_path}")
          if hasattr(module, 'my_function'): # Проверка наличия функции в модуле
              print(module.my_function()) # Пример использования функции из импортированного модуля
          else:
              print("Функция 'my_function' не найдена в модуле.")
  except FileNotFoundError:
      print(f"Файл модуля {module_path} не найден.")
  except Exception as e:
      print(f"Произошла ошибка при импорте модуля: {e}")
  Важно:
ModuleNotFoundError, FileNotFoundError и другие, чтобы предотвратить аварийное завершение программы при ошибках импорта.sys.modules позволяет избежать повторной загрузки модуля при последующих попытках импорта. Это важно для правильной работы некоторых модулей.importlib позволяет создавать более гибкие и динамичные приложения, способные адаптироваться к различным конфигурациям и потребностям.