当前位置: 首页 > news >正文

python动态加载插件 - ling

获取当前脚本路径

根据当前位置获取绝对路径,区分打包后的可执行文件开发环境

def get_plugins_dir(relative_path: str = "plugins") -> str:"""获取应用程序的插件目录如果是打包后的exe,返回exe所在目录如果是脚本,返回脚本所在目录"""if getattr(sys, "frozen", False):# 打包后的exepos = os.path.dirname(sys.executable)else:# 开发环境pos = os.path.dirname(os.path.abspath(__file__))pos = os.path.join(pos, relative_path)if not os.path.exists(pos):os.makedirs(pos)# 可选添加示例插件return pos

加载环境变量

使用闭包,允许热加载功能

def make_env_manager():"""设置动态加载包的环境变量"""env_path = []def inner(full_path: str):nonlocal env_path# 清空for path in list(env_path):sys.path.remove(path)# 记录环境路径env_path.append(os.path.dirname(full_path))for root, dirs, files in os.walk(full_path):if root not in sys.path:env_path.append(root)# 添加for path in env_path:sys.path.insert(0, path)return inner

加载插件

区分加载单个文件

def load_file(file_path: str, validate_func: Optional[Callable] = None):"""加载单个插件文件"""def validate_plugin(module):if not hasattr(module, "execute"):sys.modules.pop(module)raise ImportError(f"插件 {name} 缺少 execute() 函数")return Trueif validate_func is None:validate_func = validate_plugintry:name = os.path.splitext(os.path.basename(file_path))[0]spec = importlib.util.spec_from_file_location(name, file_path)if spec is None:raise ImportError(f"无法从文件创建模块规范: {file_path}")module = importlib.util.module_from_spec(spec)sys.modules[name] = modulespec.loader.exec_module(module)return module if validate_func(module) else Noneexcept Exception as e:# log errortraceback.print_exc()return Nonedef load_package(package_path: str, validate_func: Optional[Callable] = None):"""加载单个插件包"""def validate_plugin(module):if not hasattr(module, "execute"):sys.modules.pop(module)raise ImportError(f"插件 {name} 缺少 execute() 函数")return Trueif validate_func is None:validate_func = validate_plugintry:name = os.path.basename(package_path)if package_path not in sys.path:sys.path.insert(0, package_path)module = importlib.import_module(name)if validate_func(module):return moduletry:main_module = importlib.import_module(f"{name}.main")return main_module if validate_func(main_module) else Noneexcept ImportError:raise ImportError(f"插件包 {name} 中未找到可用的主模块")except Exception as e:traceback.print_exc()return None

获取所有插件

根据传入路经筛选插件

def scan_plugins(path: str) -> list[str]:file_ans = list(filter(lambda x: x != "",map(lambda name: (os.path.join(path, name)if not name.startswith(".")and not name.startswith("__")and os.path.splitext(name)[1] in [".py", ""]else ""),os.listdir(path),),))return file_ans

Example

  1. 获取插件文件夹路径

  2. 获取所有插件

  3. 加载环境变量

  4. 加载插件

if __name__ == "__main__":base_path = get_plugins_dir()p = scan_plugins(base_path)env_manager = make_env_manager()env_manager(base_path)loaded_plugins = load_plugins(p)print(loaded_plugins)
http://www.hskmm.com/?act=detail&tid=40596

相关文章:

  • Ubuntu Netplan
  • 实时期货、黄金贵金属、外汇数据接口文档
  • 2025年航空VR智慧教室定做厂家权威推荐榜单:幼儿保育实训室/家政实训室/航空VR实训室源头厂家精选
  • git基础命令
  • 2025年混凝土预制管桩设备定做厂家权威推荐榜单:PHC管桩生产设备/PHC管桩生产线/混凝土管桩生产设备源头厂家精选
  • stash 的一些操作
  • 2025年微小流量质量流量计企业权威推荐榜单:差压质量流量计/液体质量流量计/数字式质量流量计源头厂家精选
  • KL 散度
  • 2025年不锈钢编织绳网柔性加工厂权威推荐榜单:不锈钢编织绳网围网/不锈钢手工编织绳网/焊接不锈钢编织绳网源头厂家精选
  • 2025年超导电缆制造厂权威推荐榜单:铜线电缆/感温电缆/国标电缆源头厂家精选
  • 2025 年手臂阀最新推荐榜,聚焦技术创新与产品耐用性,筛选高适配性工程级品牌玉环手臂阀 /燃油手臂阀/暖气手臂阀公司推荐
  • ArkTS语言(四)
  • 2025 年 pe 板源头厂家最新推荐榜,技术实力与市场口碑深度解析,精选优质企业pp 板 pe 板/耐腐蚀 pe 板/耐磨 pe 板公司推荐
  • ArkTS语言(五)
  • 2025 年铝塑板厂家最新推荐榜,从技术研发到市场服务多维度考量,企业综合实力与产品竞争力深度剖析网纹/磨砂/大理石/木纹/幻彩铝塑板公司推荐
  • HarmonyOS6纯血鸿蒙开发
  • K8S如何查询PVC的已用容量和剩余可用容量
  • 学术会议会议合集 | 人工智能、未来教育 、智能控制 、计算科学 、传感器技术等EI会议合集
  • 2025 年水磨石厂家最新推荐榜,技术实力与市场口碑深度解析水磨石预制板/人造水磨石/水磨石地砖/水磨石成品地砖/彩色水磨石地砖公司推荐
  • 2025年10月短视频营销公司实力榜:五强对比评测与选择指南
  • kettle调度系统-kettle嵌入集成方式调度,稳如磐石,一分钟完成任务调度配置
  • 探索 RoCE v2:高性能网络技术在 AI 场景中的应用
  • K8S下的GPU监控
  • Unreal:多屏幕全屏后只有一个屏幕显示怎么办
  • MyEMS 的智慧大脑:从能耗建模到预测性维护的全流程技术逻辑
  • Linux-按下开机键后,究竟发生了什么
  • 用Go语言从零开始开发一个Prometheus Exporter
  • AI基础概念扫盲:人工智能入门指南
  • K8s v1.2到v1.34:从容器编排到 AI/ML 的云原生未来
  • 根据名称排序(中文、英文、数字)等