我正在开发一个PyVISA程序,它可以与电源分析仪和另外两个设备进行对话。我可以使用以下命令成功查询分析器:
import pyvisa
my_instrument = pyvisa.ResourceManager().open_resource('USB0::0x0B21::0x0025::39314C383030313939::INSTR')
print(my_instrument.query(':NUMeric:VAL?'))我想这样包装它:
import pyvisa
class YOKO( pyvisa.resources.usb.USBInstrument ):
def __init__(self):
pyvisa.ResourceManager().open_resource('USB0::0x0B21::0x0025::39314C383030313939::INSTR')我在一个单独的文件中实例化了这个类,并调用了相同的查询--但没有用。我已经经历了一些语法变体,但我一直收到错误:
AttributeError: 'YOKO' object has no attribute 'visalib'有人知道我做错了什么吗?如何包装PyVISA设备?
发布于 2015-09-10 16:28:14
1)在YOKO的__init__的第一行调用USBInstrument的__init__。这样做应该注意将visalib设置为其预期值。(cf:Why aren't Python's superclass __init__ methods automatically invoked?)
2)我不建议将pyvisa工具子类化。相反,我会将pyvisa instrument对象实例化为您自己的instrument基类的属性(即使用封装而不是继承)。当您构建自己的仪器类集合时,将会发生三件事:
A)您会发现想要稍微改变pyvisa方法的行为;例如,您可能想要配置自己的每个协议的最小超时。您可以通过简单地覆盖方法来实现这一点,但随后您可能会中断依赖于pyvisa工具未更改行为的调用代码。
B)你会想出你自己的方法/属性名称,这些方法/属性名称会意外地踩到pyvisa工具方法上;pyvisa有很多这样的方法/属性名称,它们的名字很漂亮,很直观,容易引起冲突。
C)当您进入协作仪器集或实时数据流时,您将希望您的仪器具有不同数量的轻量级行为。基本上,您最终得到的语义和业务逻辑不仅仅是仪器I/O,而且将该逻辑放入每个仪器对象中是很自然的。如果您只将实际的pyvisa instrument对象作为您自己的instrument类的一个属性(如果需要,可以完全不初始化),那么您将有更多的自由在中添加这些语义和逻辑。
第二项是非常主观的,但它是基于我过去几次走上这条完全相同的道路的经验:D
https://stackoverflow.com/questions/31013641
复制相似问题