import os import importlib.util from abc import ABC, abstractmethod # Define the interface that all plugins must implement class PluginInterface(ABC): @abstractmethod def execute(self, *args, **kwargs): """ Execute the plugin's functionality. """ pass class PluginManager: def __init__(self, plugins_dir="plugins"): """ Initialize the plugin manager. :param plugins_dir: Directory containing plugin modules. """ self.plugins_dir = plugins_dir self.plugins = {} def load_plugins(self): """ Load all plugins from the plugins directory. """ if not os.path.exists(self.plugins_dir): os.makedirs(self.plugins_dir) print(f"Created plugins directory at {self.plugins_dir}.") return for filename in os.listdir(self.plugins_dir): if filename.endswith(".py"): plugin_name = os.path.splitext(filename)[0] plugin_path = os.path.join(self.plugins_dir, filename) spec = importlib.util.spec_from_file_location(plugin_name, plugin_path) module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) # Check if the module contains a valid plugin for attr_name in dir(module): attr = getattr(module, attr_name) if isinstance(attr, type) and issubclass(attr, PluginInterface) and attr is not PluginInterface: self.plugins[plugin_name] = attr() print(f"Loaded plugin: {plugin_name}") def execute_plugin(self, plugin_name, *args, **kwargs): """ Execute a plugin by name. :param plugin_name: Name of the plugin to execute. """ plugin = self.plugins.get(plugin_name) if plugin: return plugin.execute(*args, **kwargs) else: print(f"Plugin '{plugin_name}' not found.") # Example of how the PluginManager would be used if __name__ == "__main__": manager = PluginManager() manager.load_plugins() # Execute a plugin (replace 'example_plugin' with your actual plugin name) result = manager.execute_plugin('example_plugin', param1="Hello", param2="World") print("Result:", result)