动态调用python类和函数

遇到一个需求,需要尽可能的尝试触发python模块里的行为,比如函数,类实例这样,感觉和java里的反射有点像;通过调研发现python里有getattr这个方法,类似于java里的反射机制,可以通过字符串比较方便的获取到类里的成员函数。通过importlib导入模块,然后通过inspect检查函数和类,最后在通过getattr获取对应对象执行。pytimer和packadds是我自写的不影响整体功能的函数,防止超时和解压文件。

"""
PyWalker:根据路径动态导入py文件,并尝试创建类实例和执行函数
"""
import sys
import importlib
import inspect
import pytimer
import packaddsclass PyWalker:"""动态的导入python模块并尝试触发其中的不同方法"""timer = pytimer.PyTimer()packer = packadds.PackProcessor()def __init__(self):"""初始化"""@staticmethoddef read_module(module_path: str):"""读取py文件的路径,尝试将其导入importlib的路径比较特殊,如test/sample.py需要转化变为test.sample"""if '/' in module_path:module_path = module_path.replace('/', '.')if '\\' in module_path:module_path = module_path.replace('\\', '.')if module_path.endswith('.py'):module_path = module_path[:-3]module_imported = importlib.import_module(module_path)return module_imported@staticmethoddef get_function_name(module_imported):"""获取模组里的所有函数名"""function_name_list = []for member_name, _ in inspect.getmembers(module_imported, inspect.isfunction):function_name_list.append(member_name)print("函数", function_name_list)return function_name_list@staticmethoddef get_class_name(module_imported):"""获取模组里的所有类名"""class_name_list = []for member_name, _ in inspect.getmembers(module_imported, inspect.isclass):class_name_list.append(member_name)print("类", class_name_list)return class_name_list@staticmethoddef eval_function(module_imported, function_name: str, *args):"""根据函数名动态调用函数"""module_function = getattr(module_imported, function_name)function_return = module_function(*args)return function_return@staticmethoddef parse_module(module_path: str):"""解析模组,获取函数名和类名,然后尝试执行函数"""print("导入", module_path, "输出:")module_imported = PyWalker.read_module(module_path)class_name_list = PyWalker.get_class_name(module_imported)function_name_list = PyWalker.get_function_name(module_imported)for each_class in class_name_list:PyWalker.timer.count_time(PyWalker.parse_class, module_imported, each_class)for each_function in function_name_list:PyWalker.timer.count_time(PyWalker.eval_function, module_imported, each_function)@staticmethoddef parse_class(module_imported, each_class):"""解析类,创建实例,尝试执行函数"""module_class = getattr(module_imported, each_class)function_name_list = PyWalker.get_function_name(module_class)if function_name_list[0] == '__init__':# 因为已经创建过实例所以不再执行initfunction_name_list.pop(0)class_instance = module_class()for each_function in function_name_list:PyWalker.eval_function(class_instance, each_function)if PyWalker.timer.get_errors():print(PyWalker.timer.get_errors())@staticmethoddef parse_packet(packet_path: str):"""输入一个whl或zip包的路径,尝试解压然后逐个导入运行"""if packet_path.endswith('.py'):# 如果是py文件就不用解压了pyfile_list = [packet_path]else:unzipped_dir = PyWalker.packer.unzip_path(packet_path)pyfile_list = PyWalker.packer.get_dir_files(unzipped_dir, '.py')for each_pyfile in pyfile_list:try:PyWalker.parse_module(each_pyfile)except Exception as e:print("error:", each_pyfile, e)PyWalker.packer.delete_unzips()if __name__ == '__main__':file_path = sys.argv[1]my_walker = PyWalker()my_walker.parse_packet(file_path)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/50299.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5.11 汇编语言:仿写IF条件语句

条件语句,也称为IF-ELSE语句,是计算机编程中的一种基本控制结构。它允许程序根据条件的真假来执行不同的代码块。条件语句在处理决策和分支逻辑时非常有用。一般来说,条件语句由IF关键字、一个条件表达式、一个或多个代码块以及可选的ELSE关键…

java开源 VR全景商城 saas商城 b2b2c商城 o2o商城 积分商城 秒杀商城 拼团商城 分销商城 短视频商城 小程序商城搭建 bbc

​ 1. 涉及平台 平台管理、商家端(PC端、手机端)、买家平台(H5/公众号、小程序、APP端(IOS/Android)、微服务平台(业务服务) 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前…

回归预测 | MATLAB实现BES-SVM秃鹰搜索优化算法优化支持向量机多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现BES-SVM秃鹰搜索优化算法优化支持向量机多输入单输出回归预测(多指标,多图) 目录 回归预测 | MATLAB实现BES-SVM秃鹰搜索优化算法优化支持向量机多输入单输出回归预测(多指标,多图)效…

go gorm一对多has many

has many 与另一个模型建立了一对多的连接。 不同于 has one,拥有者可以有零或多个关联模型。 例如,您的应用包含 user 和 credit card 模型,且每个 user 可以有多张 credit card。 定义model // User 有多张 CreditCard,UserI…

python中的matplotlib画直方图(数据分析与可视化)

python中的matplotlib画直方图(数据分析与可视化) import numpy as np import pandas as pd import matplotlib.pyplot as pltpd.set_option("max_columns",None) plt.rcParams[font.sans-serif][SimHei] plt.rcParams[axes.unicode_minus]Fa…

TCP缓冲区参数调优

1、系统原值查询 [lybadmin autopush]$ cat /proc/sys/net/core/rmem_max 4194304 [lybadmin autopush]$ cat /proc/sys/net/core/wmem_max 1048576 [lybadmin autopush]$ cat /proc/sys/net/ipv4/tcp_rmem 4096 87380 4194304 [lybadmin autopush]$ cat /proc/sys/net/ip…

centos8安装mysql

1.首先用finalShell远程连接到服务器 2.如果服务器之前安装过mysql请先卸载,我这里是用yum安装的,现在通过yum去卸载 yum remove -y mysql find / -name mysql //找到残留的文件,再通过rm -rf去删除对应的文件3.下面正式开始安装 (1&#…

基于微信小程序+Springboot校园二手商城系统设计和实现

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、目前专注于大学生项目实战开发,讲解,毕业答疑辅导✌ 🍅文末获取源码联系🍅 👇&#x1f3…

使用 OpenAI GPT 模型的最佳实践

推荐:使用NSDT场景编辑器助你快速搭建可二次编辑的3D应用场景 为了帮助用户获得最佳输出,OpenAI 提供了使用 GPT 模型的最佳实践。这来自体验,因为许多用户不断尝试使用此模型并找到了最有效的方法。 在本文中,我将总结使用 Ope…

分数规划(二分)

链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 题目描述 小咪是一个土豪手办狂魔,这次他去了一家店,发现了好多好多(n个)手办,但他是一个很怪的人,每次只想买k个手办&a…

JavaSE-21 【Stream流】

1 Stream的介绍 1.1 概念 stream流操作是Java 8提供一个重要新特性,它允许开发人员以声明性方式处理集合,其核心类库主要改进了对集合类的 API和新增Stream操作。Stream类中每一个方法都对应集合上的一种操作。将真正的函数式编程引入到Java中&#xf…

【PHP】数据类型运算符位运算

文章目录 数据类型简单(基本)数据类型:4个小类复合数据类型:2个小类特殊数据类型:2个小类类型转换类型判断整数类型浮点类型布尔类型 运算符赋值运算符算术运算符比较运算符逻辑运算符连接运算符错误抑制符三目运算符自…

Apache ShenYu 学习笔记一

1、简介 这是一个异步的,高性能的,跨语言的,响应式的 API 网关。 官网文档:Apache ShenYu 介绍 | Apache ShenYu仓库地址:GitHub - apache/shenyu: Apache ShenYu is a Java native API Gateway for service proxy, pr…

nginx+keepalived负载均衡和高可用配置

概述 nginx用来负载均衡,keepalived是用来实现VIP故障切换。 配置 nginxkeepalived配置中,后端普通服务器不需要lvs实现负载均衡。 在服务器上停止之前的lvs配置 /etc/init.d/lvs_rs stop 1.nginx的配置 在主备节点上测试 配置nginx之前需要将kee…

UE学习记录03----UE5.2 使用MVVM示例

1.打开ue5.2新建C项目 2.项目中通过类导向新建C类,父类选择为UMVVMViewModelBase,创建完成会自动打开vs 3.在VS中对新建的类进行宏定义 使用 C 类向导 创建的类声明自动通过 UCLASS() 宏进行处理。 UCLASS() 宏使得引擎意识到这个类的存在,并…

React Native 任务列表实战

通过 ToDo 的小项目实战,我们可以回顾页面布局,事件的监听,React Native 中的钩子函数使用。 整体项目框架搭建以及相关基础样式 首先我们先完成项目的整体框架搭建,把页面中相关的元素和样式类名定义好。并且表明对应单独组建的…

【linux】NFS调试总结

文章目录 00. ENV10. 简述20. 下载、安装、配置30. 使用1. 从uboot中设置NFS启动文件系统2. 调试 80. 问题1. NFS版本不匹配问题 90. 附件91. 服务端NFS配置项简述 00. ENV ubuntn1804 10. 简述 百度百科:https://baike.baidu.com/item/%E7%BD%91%E7%BB%9C%E6%96%87…

【Rust】Rust学习 第十九章高级特征

现在我们已经学习了 Rust 编程语言中最常用的部分。在第二十章开始另一个新项目之前,让我们聊聊一些总有一天你会遇上的部分内容。你可以将本章作为不经意间遇到未知的内容时的参考。本章将要学习的功能在一些非常特定的场景下很有用处。虽然很少会碰到它们&#xf…

阿里云短信发送模板

1.读取yml的配置Data ConfigurationProperties(prefix "aliyun.sms") public class SmsProperties {private String signName;private String templateCode;private String accessKey;private String secret; } 2.封装方法并注入容器 Bean public class SmsTempla…

上海交大ACM班总教头团队重磅新作,带你动手学机器学习(文末赠书4本)

目录 0 写在前面1 什么是机器学习?2 ACM 班总教头:俞勇3 动手学习机器学习赠书活动 0 写在前面 机器学习强基计划聚焦深度和广度,加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理;“广”在分析多个机器…