Python зависает даже при обработке исключений

Я подключил малиновый PI к АЦП MCP3008, который измеряет аналоговое напряжение на термисторе. Я использую gpiozero библиотека python для связи между PI и ADC. Мой код ниже работает в течение нескольких минут, затем выдает ошибку, а затем зависает на функции get_temp_percent, Эта функция возвращает среднее из пяти измерений от АЦП. я использую Signal вывести исключение через 1 секунду ожидания, чтобы попытаться преодолеть зависание, но оно просто выдает ошибку и зависает в любом случае. Похоже, ничего в моем except заявление читается. Почему я не избегаю зависания кода?

import time
from gpiozero import MCP3008
from math import log
import pymysql.cursors
from datetime import datetime as dt
import signal 
import os


def handler(signum, frame):
    print('Signal handler called with signal', signum, frame)
    raise Exception("Something went wrong!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")   


def get_temp_percent(pos=0):
    x=[]
    for i in range(0,5):
        while True:
            try:
                signal.signal(signal.SIGALRM, handler)
                signal.alarm(1)
                adc = MCP3008(pos)
                x.append(adc.value)
                #adc.close()
            except Exception as inst:
                print('get_temp_percent {}'.format(inst) )
                signal.alarm(0)
                continue
            break
        signal.alarm(0)
        time.sleep(.1)
    return round(sum(x)/len(x),5)


def write_date(temp0):
    <writes temp0 to mysql db >        

# Connect to the database
connection = pymysql.connect(host='', user='', password='', db='',cursorclass = pymysql.cursors.DictCursor)

while True:        
    temp_percent = get_temp_percent()
    print('Temp Percent = {}'.format(temp_percent) )

    <some function that do some arithmetic to go temp_percent to temp0>

    write_date(temp0)
    print('Data Written')

    time.sleep(1)
    print('Sleep time over')
    print('')

функция get_temp_percent вызывает проблему ниже

Signal handler called with signal 14 <frame object at 0x76274800>
Exception ignored in: <bound method SharedMixin.__del__ of SPI(closed)>
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/gpiozero/mixins.py", line 137, in __del__
    super(SharedMixin, self).__del__()
  File "/usr/lib/python3/dist-packages/gpiozero/devices.py", line 122, in __del__
    self.close()
  File "/usr/lib/python3/dist-packages/gpiozero/devices.py", line 82, in close
    old_close()
  File "/usr/lib/python3/dist-packages/gpiozero/pins/local.py", line 102, in close
    self.pin_factory.release_all(self)
  File "/usr/lib/python3/dist-packages/gpiozero/pins/__init__.py", line 85, in release_all
    with self._res_lock:
  File "/home/pi/Desktop/testing exceptions.py", line 13, in handler
    raise Exception("Something went wrong!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
Exception: Something went wrong!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

1 ответ

Решение

Похоже, ваш звонок в gpiozero делает большую работу за кулисами. Когда ваше исключение обрабатывается, библиотека пытается очистить и застревает.

Я быстро взглянул на документы для библиотеки, и, похоже, вы сможете удержать булавки, чтобы вы могли использовать их повторно.

например

import ...

adcs = {}

def get_adc_value(pos):
    if pos not in adcs:
        adcs[pos] = MCP3008(pos)
    return adcs[pos].value

def get_temp_percent(pos=0):
    x = []
    for i in range(0, 5):
        x.append(get_adc_value(pos))
        time.sleep(.1)
    return round(sum(x)/len(x),5)

while True:
   temp_percent = get_temp_percent()
   ...
Другие вопросы по тегам