当前位置: 首页 > 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.jsqmd.com/news/25730/

相关文章:

  • 实用指南:C++设计模式_结构型模式_适配器模式Adapter
  • 2025年混凝土预制管桩设备定做厂家权威推荐榜单:PHC管桩生产设备/PHC管桩生产线/混凝土管桩生产设备源头厂家精选
  • 2025年微小流量质量流量计企业权威推荐榜单:差压质量流量计/液体质量流量计/数字式质量流量计源头厂家精选
  • 2025年阻燃pp管厂商权威推荐榜单:阻燃pp管厂商/塑料pp管/pp化工管源头厂家精选
  • ArkTS语言(六)
  • rbd元数据
  • 2025 年氧舱厂家最新推荐榜,聚焦企业技术创新、产品品质与市场口碑深度解析方圆组合式/减压/盾构气压/高原平衡/实验/软体氧舱公司推荐
  • 2025年进口气动塑料球阀定制厂家权威推荐榜单:进口气动超低温球阀/进口气动三片式球阀/进口气动衬氟球阀源头厂家精选
  • KL 散度
  • 2025年不锈钢编织绳网柔性加工厂权威推荐榜单:不锈钢编织绳网围网/不锈钢手工编织绳网/焊接不锈钢编织绳网源头厂家精选
  • 页面增加水印及水印防删
  • onBeforeMount 和 onMounted区分总结
  • 2025年超导电缆制造厂权威推荐榜单:铜线电缆/感温电缆/国标电缆源头厂家精选
  • Linux应用(6)——网络通信/TCP/IP - 详解
  • 2025 年 pe 板源头厂家最新推荐榜,技术实力与市场口碑深度解析,精选优质企业pp 板 pe 板/耐腐蚀 pe 板/耐磨 pe 板公司推荐
  • ArkTS语言(五)
  • 2025 年铝塑板厂家最新推荐榜,从技术研发到市场服务多维度考量,企业综合实力与产品竞争力深度剖析网纹/磨砂/大理石/木纹/幻彩铝塑板公司推荐
  • 小白指南:Apache DolphinScheduler 补数据功能实操演示
  • C++程序(胡言乱语版)
  • 2025 年干洗机源头厂家最新推荐榜,技术实力与市场口碑深度解析,助力精准选购干洗机设备/工业干洗机/商用干洗机/洗衣房干洗机公司推荐
  • 2025 年干洗机源头厂家最新推荐榜,技术实力与市场口碑深度解析,助力精准选购干洗机设备/工业干洗机/商用干洗机/洗衣房干洗机公司推荐
  • 关于如何解决HP笔记本键盘失灵的方法
  • ({behavior: smooth}) 在移动端不生效的问题解决 ios不平滑,使用smoothscroll-polyfill(页面平滑滚动)插件
  • 2025 年洗脱机源头厂家最新推荐榜,技术实力与市场口碑深度解析,甄选靠谱优质品牌隔离式双扉洗脱机/商用洗脱机/洗衣房洗脱机公司推荐
  • ArkTS语言(三)
  • 基于第三方heleket api接入usdt支付
  • 2025年激光熔覆涂层制造厂权威推荐:熔覆激光/高速激光熔覆/激光熔覆源头厂家精选
  • Legacy模式虚拟机,grub文件丢失如何处理
  • 2025年省电中央空调品牌权威推荐榜单:双出风中央空调/一拖四中央空调/智能中央空调品牌精选
  • 魔域电脑版下载安装教程:重返经典魔幻世界的完整攻略(含新手入门+登录异常修复)