Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 19, 2016 15:43:00

bigmak
Зарегистрирован: 2016-08-19
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Нужен взгляд на код со стороны

Добрый день!

Собрал “на коленке” код, который опрашивает датчик bmp180 на Raspberry Pi и записывает данные в таблицу БД. По принудительному запуску в самой папке ($ python get_data.py) все работает, строчки в БД исправно добавляются. А вот если переместить файлы с кодом в папку планировщика CRON, то лезут ошибки.

Вот сам код файла “get_data.py”:

 #!/usr/bin/python
import Adafruit_BMP.BMP085 as BMP085
sensor = BMP085.BMP085()
a = '{!s:5}'.format(sensor.read_temperature())
b = '{!s:.6}'.format(sensor.read_pressure()/133.322)
from mysql.connector import MySQLConnection, Error
from python_connect import read_db_config
def insert_temp_pressure(Temp, Press):
    query = "INSERT INTO Temp_press_table(Temp,Press) " \
            "VALUES(%s,%s)"
    args = (Temp, Press)
    try:
        db_config = read_db_config()
        conn = MySQLConnection(**db_config)
       cursor = conn.cursor()
        cursor.execute(query, args)
        if cursor.lastrowid:
            print('last insert id', cursor.lastrowid)
        else:
            print('last insert id not found')
        conn.commit()
    except Error as error:
        print(error)
    finally:
        cursor.close()
        conn.close()
def main():
   insert_temp_pressure(a,b)
if __name__ == '__main__':
    main()

А это ошибка:
Traceback (most recent call last):
File “/etc/cron.d/get_data.py”, line 41, in <module>
main()
File “/etc/cron.d/get_data.py”, line 38, in main
insert_temp_pressure(a,b)
File “/etc/cron.d/get_data.py”, line 34, in insert_temp_pressure
cursor.close()
UnboundLocalError: local variable ‘cursor’ referenced before assignment

Вопрос: есть у меня в коде ошибки или нет? Никак не пойму.
Спасибо!

Отредактировано bigmak (Авг. 19, 2016 17:09:54)

Офлайн

#2 Авг. 19, 2016 17:04:09

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Нужен взгляд на код со стороны

Вход в finally может быть до инициализации conn и cursor. Это наверное нужно учесть.

Офлайн

#3 Авг. 19, 2016 17:05:43

bigmak
Зарегистрирован: 2016-08-19
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Нужен взгляд на код со стороны

Shaman
Вход в finally может быть до инициализации conn и cursor. Это наверное нужно учесть.
А можно прям для совсем начинающего?

Вот этот кусок
finally:
cursor.close()
conn.close()

перенести? куда?
Спасибо!

Офлайн

#4 Авг. 19, 2016 17:07:54

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Нужен взгляд на код со стороны

Давайте Вы сначала оформите текст при помощи тега “code”, а затем подумаем что с ним лучше сделать.

Офлайн

#5 Авг. 19, 2016 17:15:37

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Нужен взгляд на код со стороны

Правильно сделать что-то в духе

 conn = cursor = None
try:
    db_config = read_db_config()
    conn = MySQLConnection(**db_config)
    cursor = conn.cursor()
    ### .....
    conn.commit()
except Error as error:
    print(error)
finally:
    if cursor:
        cursor.close()
    if conn:
        conn.close()
Или ловить исключения инициализации отдельно от исключений при работе с базой.

Отредактировано Shaman (Авг. 19, 2016 17:16:12)

Офлайн

#6 Авг. 21, 2016 11:05:51

bigmak
Зарегистрирован: 2016-08-19
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Нужен взгляд на код со стороны

Shaman
Правильно сделать что-то в духе

Спасибо за совет.
Видимо у меня проблема в другом (оффтопик). При запуске вот такой командой в CRON все работает.
15 * * * * cd /etc/cron.d/ && /usr/bin/python /etc/cron.d/get_data.py

Спасибо за помощь!

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version