From a7c0440e9b90bbede87099c931a051a760027c2b Mon Sep 17 00:00:00 2001 From: Reinier van der Leer Date: Wed, 20 Mar 2024 16:36:43 +0100 Subject: fix(agent): Fix and windows-proof `scan_plugins` - Improve error output for failure to load plugin - Fix logic to determine qualified module name - Use `importlib` rather than `__import__` magic function This unbreaks `scan_plugins` on Windows. --- autogpts/autogpt/autogpt/plugins/__init__.py | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/autogpts/autogpt/autogpt/plugins/__init__.py b/autogpts/autogpt/autogpt/plugins/__init__.py index 0b08a62e4..618a9895a 100644 --- a/autogpts/autogpt/autogpt/plugins/__init__.py +++ b/autogpts/autogpt/autogpt/plugins/__init__.py @@ -6,7 +6,6 @@ import inspect import json import logging import os -import sys import zipfile from pathlib import Path from typing import TYPE_CHECKING, List @@ -220,21 +219,21 @@ def scan_plugins(config: Config) -> List[AutoGPTPluginTemplate]: plugins_config = config.plugins_config # Directory-based plugins - for plugin_path in [f.path for f in os.scandir(config.plugins_dir) if f.is_dir()]: + for plugin_path in [f for f in Path(config.plugins_dir).iterdir() if f.is_dir()]: # Avoid going into __pycache__ or other hidden directories - if plugin_path.startswith("__"): + if plugin_path.name.startswith("__"): continue - plugin_module_path = plugin_path.split(os.path.sep) - plugin_module_name = plugin_module_path[-1] - qualified_module_name = ".".join(plugin_module_path) + plugin_module_name = plugin_path.name + qualified_module_name = ".".join(plugin_path.parts) try: - __import__(qualified_module_name) - except ImportError: - logger.error(f"Failed to load {qualified_module_name}") + plugin = importlib.import_module(qualified_module_name) + except ImportError as e: + logger.error( + f"Failed to load {qualified_module_name} from {plugin_path}: {e}" + ) continue - plugin = sys.modules[qualified_module_name] if not plugins_config.is_enabled(plugin_module_name): logger.warning( @@ -261,8 +260,8 @@ def scan_plugins(config: Config) -> List[AutoGPTPluginTemplate]: zipped_package = zipimporter(str(plugin)) try: zipped_module = zipped_package.load_module(str(module.parent)) - except ZipImportError: - logger.error(f"Failed to load {str(module.parent)}") + except ZipImportError as e: + logger.error(f"Failed to load {module.parent} from {plugin}: {e}") continue for key in dir(zipped_module): -- cgit v1.2.3