字符串实现包名导入和函数使用
最近用
django
想动态的注册相关的函数来实现定时任务,但是执行定时任务的函数和所在文件名是不确定的,需要动态的调用
注册函数
def register_func(func_name, package_name: str, trigger, configuration):
'''
注册包名和函数
:param package_name:所在的包名
:param func_name:
:return:
'''
configuration = json.dumps(configuration, ensure_ascii=False)
if not Task.objects.filter(name=func_name):
Task.objects.create(name=func_name,
package_name=package_name)
else:
logger.info("相同函数名 %s 的任务已经注册!" % func_name)
注册函数的使用
register_func('func_name',
'app_name.dir_name.file_name',
'cron',
cron_time)
把这些数据存入数据库,通过task来获取数据数据
动态引用
需要使用importlib
import importlib
package_path = importlib.util.find_spec(task.package_name)
# 因为是函数内部使用func
if package_path:
package = importlib.import_module(task.package_name)
func = getattr(package, task.name)
func
就是对应需要使用的函数了