Python 服务加载器:动态加载和使用服务类
import os import importlib
services_abspath_arr = [] services_arr = [] services_dir = os.getcwd() + '\services'
遍历模块文件(绝对路径)加到services_abspath_arr数组
选择服务函数
def service_select(str): for service_item in services_arr: if str.capitalize() == service_item.class.name: return service_item
def foreach_file(path_name): for root, dirs, files in os.walk(path_name): for f in files: services_abspath_arr.append(os.path.join(root, f))
读取模块
f:文件路径
def loadModule(f): # 将f变成相对路径 f = f.replace(services_dir + '', '').replace('.py', '').replace('', '/') mod = importlib.import_module( 'services.' + f.replace('/', '.') ) arr_1 = f.split('/') cs_service = getattr(mod, arr_1[len(arr_1) - 1].capitalize()) # service的class形式 service = cs_service() # print(services) services_arr.append(service)
foreach_file(services_dir) for f in services_abspath_arr: if f.find('.pyc') == -1 and f.find('init') == -1: # print(f) loadModule(f)
上面的代码实现了以下功能:
1. 遍历指定目录下的所有模块文件,并将其绝对路径加入到一个数组中
2. 加载这些模块文件,并将其中的服务类实例化,将其加入到一个服务数组中
3. 提供一个选择服务的函数,根据服务名返回相应的服务实例
以下是一个示例,演示如何使用这些服务:
导入服务选择函数
from service_loader import service_select
选择服务
my_service = service_select('MyService')
调用服务方法
result = my_service.do_something()
输出结果
print(result)
原文地址: https://www.cveoy.top/t/topic/kU0b 著作权归作者所有。请勿转载和采集!