Python测量脚本:如何让lab模块访问主脚本中的类实例?
解决lab模块无法访问主脚本类实例的问题
这个问题我之前也碰到过!核心原因是Python里每个模块都有自己独立的命名空间,你的lab模块根本看不到主脚本里创建的实例a,所以才会报"module 'lab' has no attribute 'a'"的错。
具体来说,lab.py里的str_to_class函数用了sys.modules[__name__],这里的__name__在lab模块运行时就是字符串'lab',所以它只会去lab模块自己的属性里找'a',但你的实例a是定义在主脚本(也就是__main__模块)里的,完全不在同一个命名空间里,肯定找不到。
下面给你几个实用的解决方案:
方案1:让str_to_class直接访问主模块命名空间
修改lab.py的函数,默认去主脚本的命名空间里查找实例:
import sys meas_dict = {} def str_to_class(classname): # 直接引用主模块(主脚本)的命名空间 main_module = sys.modules['__main__'] return getattr(main_module, classname)
修改后,主脚本里调用lab.str_to_class('a')就能直接拿到你创建的<instruA.instruA at 0x1b2ba7d1e80>实例了。
方案2:主动把实例挂载到lab模块
如果不想修改lab.py,也可以在主脚本里把需要访问的实例直接绑定到lab模块的属性上:
from instruA import * a = instruA() meas_dict = 'a.msg' import lab lab.meas_dict = meas_dict # 把实例a交给lab模块 lab.a = a # 现在就能正常调用了 lab.str_to_class('a')
不过这种方法如果要添加多个设备实例,得逐个挂载,灵活性稍差。
方案3:直接解析测量命令字符串(最贴合你的场景)
既然你的meas_dict是'a.msg'这种"实例.方法/属性"的格式,不如写一个解析函数一步到位,省得还要先拿实例再调用方法:
修改lab.py:
import sys meas_dict = {} def resolve_meas_command(cmd_str): # 从主模块获取命名空间 main_module = sys.modules['__main__'] # 拆分命令字符串,比如'a.msg'拆成['a', 'msg'] parts = cmd_str.split('.') # 先拿到目标实例 obj = getattr(main_module, parts[0]) # 依次获取后续的方法/属性 for part in parts[1:]: obj = getattr(obj, part) return obj
主脚本里直接使用:
# 解析命令拿到方法对象 msg_method = lab.resolve_meas_command('a.msg') # 调用方法得到结果 print(msg_method()) # 输出123
这个方案完全适配你"用户只需添加设备,后续流程自动处理"的设计,用户只要写对meas_dict里的字符串就行,不用关心底层逻辑。
推荐优先考虑方案1或方案3,尤其是方案3,后续扩展多个设备也非常方便。
内容的提问来源于stack exchange,提问作者DaanMusic
相关产品推荐
相关产品推荐

