构造函数/文件引用异常:AttributeError: 'Sr830'对象无'resource_manager'属性
问题:Sr830类初始化时触发AttributeError: 'Sr830' object has no attribute 'resource_manager'
我是Python新手,使用GPIB转USB线缆连接锁相放大器到电脑,Pyvisa能正常读取仪器数据,但使用labdrivers的Sr830驱动类读写参数时出现错误。
Sr830类的__init__方法(标记出可能引发问题的代码行)
import pyvisa import logging # 原代码漏导入logging模块,此处补充 # create a logger object for this module logger = logging.getLogger(__name__) # added so that log messages show up in Jupyter notebooks logger.addHandler(logging.StreamHandler()) class Sr830: """Interface to a Stanford Research Systems 830 lock in amplifier.""" def __init__(self, gpib_addr): """Create an instance of the Sr830 object. :param gpib_addr: GPIB address of the SR830 """ try: # 可能引发问题的行:尝试创建ResourceManager self.resource_manager = pyvisa.ResourceManager() except OSError: logger.exception("\n\tCould not find the VISA library. Is the VISA driver installed?\n\n") self._gpib_addr = gpib_addr self._instrument = None # 可能引发问题的行:直接访问未初始化的resource_manager self._instrument = self.resource_manager.open_resource("GPIB::%d" % self._gpib_addr)
测试代码
from labdrivers.srs import sr830 sr_gpib_address = 8 lock_in = sr830.Sr830(sr_gpib_address)
文件路径:\anaconda3\lib\site-packages\labdrivers\srs\sr830.py,使用Spyder环境下的Python3.9。
报错信息
Traceback (most recent call last): File ~\test.py:14 in <module> lock_in = sr830.Sr830(sr_gpib_address) File ~\anaconda3\lib\site-packages\labdrivers\srs\sr830.py:28 in __init__ self._instrument = self.resource_manager.open_resource("GPIB::%d" % self._gpib_addr) AttributeError: 'Sr830' object has no attribute 'resource_manager'
问题原因
当pyvisa.ResourceManager()抛出OSError时,try-except块仅打印日志但不终止程序执行,后续代码依然尝试访问self.resource_manager——而该属性在异常发生时根本没有被初始化,因此触发AttributeError。
解决方案
修改__init__方法,确保ResourceManager创建失败时,程序不会执行后续依赖它的代码,以下是两种可行方式:
方式1:捕获异常后主动终止初始化
在except块中重新抛出异常,阻止后续代码运行:
def __init__(self, gpib_addr): """Create an instance of the Sr830 object. :param gpib_addr: GPIB address of the SR830 """ try: self.resource_manager = pyvisa.ResourceManager() except OSError: logger.exception("\n\tCould not find the VISA library. Is the VISA driver installed?\n\n") raise # 重新抛出异常,终止初始化流程 self._gpib_addr = gpib_addr self._instrument = None self._instrument = self.resource_manager.open_resource("GPIB::%d" % self._gpib_addr)
方式2:提前初始化属性,增加有效性判断
在try块前先初始化self.resource_manager为None,后续判断其有效性再执行操作:
def __init__(self, gpib_addr): """Create an instance of the Sr830 object. :param gpib_addr: GPIB address of the SR830 """ self.resource_manager = None try: self.resource_manager = pyvisa.ResourceManager() except OSError: logger.exception("\n\tCould not find the VISA library. Is the VISA driver installed?\n\n") self._gpib_addr = gpib_addr self._instrument = None # 先判断resource_manager是否有效,再执行连接操作 if self.resource_manager is not None: self._instrument = self.resource_manager.open_resource("GPIB::%d" % self._gpib_addr) else: logger.error("Failed to initialize resource manager, cannot connect to instrument.")
同时注意补充原代码中缺失的logging模块导入,避免其他隐藏问题。
内容的提问来源于stack exchange,提问作者Nidhish Sharma
相关产品推荐
相关产品推荐

