问题描述
我对Python还是很陌生,在使用Python的某些方面遇到麻烦。
我正在编写代码,以使用 pyvisa 控制一些仪器。为简单起见,我在这里仅显示一种仪器(Thor Labs功率计)。如果我将所有代码放到一个文件中,则可以正常工作。下面的代码首先搜索可用的仪器,并定义仪器ID( ThorID ):
import pyvisa
rm = pyvisa.ResourceManager() # Set up resource manager
resource_list = rm.list_resources() # Create a list of available instruments
# Thor Labs power meters should contain this string
Thor_str = "0x1313::0x8079"
# Search for a Thor Labs meter in the resource list
Thor = [i for i,s in enumerate(resource_list) if Thor_str in s]
if len(Thor) == 0:
print("No Thor Labs power meter detected")
ThorID = ""
else:
print("Thor Labs power meter detected")
ThorID = resource_list[Thor[0]] # This is the Thor Labs VISA ID
然后我定义功率计
class powermeter:
"Power meter class. Contains parameter values and commands."
def __init__(self,wavelength=450,meter_range=200e-3,id=ThorID):
""" Define default parameter values """
self.wavelength = wavelength # nm
self.meter_range = meter_range # W
self.ID = id # Meter's VISA ID
self.name = "" # Meter instance name
def connect(self):
"""Open a connection to the power meter"""
self.name = rm.open_resource(self.ID)
def set_wavelength(self,wavelength):
"""Set the power meter wavelength (nm)"""
self.name.write("CORR:WAV " + str(wavelength))
def set_range(self,meter_range):
"""Set the power meter range (W)"""
self.name.write("POW:DC:RANG " + str(meter_range))
def read(self):
"""Read the power meter output (mW)"""
return float(self.name.query("READ?"))*1000
最后3条线打开与仪表的连接并设置波长(至400 nm)。我可以在一个.py文件中一起确认所有这些代码。
enter pm = powermeter() # Create instance of powermeter
pm.connect() # Connect to this power meter
pm.set_wavelength(400) # Set wavelength to 400 nm
尝试将Class拆分成单独的.py文件时遇到了很多麻烦。我想这样做是为了保持代码整洁……最终,我将添加一个GUI和另一个类,并且我不想要一个庞大而笨拙的文本。
我幼稚的第一次尝试就是将此作为我的主要代码,上面编写的类保存在 PM_class.py 中:
import pyvisa
rm = pyvisa.ResourceManager() # Set up resource manager
resource_list = rm.list_resources() # Create a list of available instruments
# Thor Labs power meters should contain this string
Thor_str = "0x1313::0x8079"
# Search for a Thor Labs meter in the resource list
Thor = [i for i,s in enumerate(resource_list) if Thor_str in s]
if len(Thor) == 0:
print("No Thor Labs power meter detected")
ThorID = ""
else:
print("Thor Labs power meter detected")
ThorID = resource_list[Thor[0]] # This is the Thor Labs VISA ID
from PM_class.py import powermeter
但是在 PM_class.py 中出现错误- NameError:未定义名称'ThorID'
我不明白,因为在尝试导入Class之前,在行中明确定义了ThorID?
任何有关如何解决此问题的建议都将受到欢迎!
解决方法
级功率计在另一个模块中, 在这个字符串中
def __init__(self,wavelength=450,meter_range=200e-3,id=ThorID):
您尝试使用var ThorID
对其进行初始化,但是该类本身已封装并且无法从当前模块读取此var。尝试在ThorID
中定义PM_class.py
变量或使用
def __init__(self,id=None):
并在初始化类时传递ID
pmeter=powermeter(id=ThorID)