我本该很简单的事情遇到很多麻烦,但我无法使其正常工作。
我有以下函数在其自己的线程上永远循环。我需要从另一个函数中编辑该函数中的一些变量。
这始终在检查DS18B20温度传感器并记录最小/最大温度。这些是我需要从其他函数访问并重置的一些变量。
def getTemp():
while True:
try:
i = 0
# count how many ds18b20s are found
for sensor in W1ThermSensor.get_available_sensors():
i = i + 1
global temperatures
# setup arrays
IDs = [0]*i
temps = [0]*i
minTemp = [0]*i
maxTemp = [0]*i
i = 0 # reset counter
for sensor in W1ThermSensor.get_available_sensors():
prevTemps[i] = temps[i]
IDs[i] = sensor.id # get IDs
temps[i] = (sensor.get_temperature(W1ThermSensor.DEGREES_F)) # get temps
temps[i] = (round(temps[i], 2)) # round
if temps[i] > maxTemp[i]:
maxTemp[i] = temps[i]
saveDs18b20Max(maxTemp[i],IDs[i])
if temps[i] < minTemp[i]:
minTemp[i] = temps[i]
saveDs18b20Min(minTemp[i],IDs[i])
i = i + 1 # count
temperatures = temps[:]
except:
print('error')
以上方法效果很好,但我无法访问任何变量。我添加了全局温度变量,然后将临时列表的内容复制到该变量,但是当我从另一个函数调用它时,出现以下错误。
NameError:未定义名称“温度”
这是我尝试打印温度的功能。
def resetMin(addr):
print("resetMin")
print(addr)
print(temperatures)
我使用Visual Studio Code,并且就温度而言,它是全局的,因为在我调用它时不会显示错误。
谢谢
答案 0 :(得分:0)
首先,您应该尝试在方法之外声明温度,然后声明全局原因,因为global仅告诉您您不是在创建局部方法变量,而是在使用全局变量。使温度超出方法范围。
因此,为此编辑最后一个方法。
def resetMin(addr):
global temperatures
print("resetMin")
print(addr)
print(temperatures)
答案 1 :(得分:0)
建议引发一个类C,该类包含要在循环中操作并通过另一种方法访问的数据。
class C:
def __init__(self):
self.temperatures=0
def getTemp(c):
while True:
try:
#...
# hanlde c.temperatures
except:
sleep(0.1)
def resetMin(addr, c):
# hanlde c.temperatures
c=C()
# thread.start_new_thread(getTemp,(c,))
# thread.start_new_thread(resetMin,('addr1',c,))