Запись в базу данных MySQL при запуске Pi с использованием Python

На моем Raspberry Pi установлена ​​база данных MySQL. Когда мой Pi запускается, он запускает скрипт Python, который записывает данные в базу данных. Скрипт записывает дату, время и IP-адрес в базу данных.

Сценарий Python для этого отлично работает при запуске из терминала. Однако, когда я пытаюсь запустить скрипт python при запуске, ничего не происходит. Создание cronjob для запуска скрипта Python показало, что возникает ошибка: "ImportError: No module named mysql.connector"

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

Я попытался запустить скрипт непосредственно из: /etc/rc.local, работающий как:

sudo python /home/pi/PyScripts/py2db.py&

Я также создал sh-скрипт под названием Launcher. Затем я вызываю скрипт python в скрипте sh и вызываю launcher.sh из crontab. Идея сценария запуска заключалась в том, что я мог бы просто добавить дополнительные строки в этот сценарий, если бы я добавил больше вещей в автозагрузку моего Pi.

Сценарий Python запускается нормально при запуске файла launcher.sh или файла py2db.py.

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

Кронтаб-код:

@reboot /home/pi/Scripts/launcher.sh >/home/pi/Logs/cronlog 2>&1

launcher.sh

#!/bin/sh
launcher.sh
python /home/pi/PyScripts/py2db.py

Журнал Crontab

Traceback (most recent call last):
  File "/home/pi/PyScripts/py2db.py", line 3, in <module>
    import mysql.connector
ImportError: No module named mysql.connector

py2db.py

#!/usr/bin/python3

import mysql.connector
import datetime
from ipaddress import IPAddress
import sys

ipaddress = IPAddress()
ip = ipaddress.get_ipaddress()

now = datetime.datetime.now()
time = now.isoformat()
date = now.strftime("%Y-%m-%d")

mydb = mysql.connector.connect(
  host="localhost",
  user="mark",
  passwd="password",
  database="mydb"
)

mycursor = mydb.cursor()

sql = "INSERT INTO piLog (date, time, ip) VALUES (%s, %s, %s)"
val = (date, time, ip)
mycursor.execute(sql, val)

mydb.commit()

print(mycursor.rowcount, "record inserted.")
print("[py2db] - Done.")

sys.exit()

Я ожидаю, что скрипт python запустится при запуске и запишет запись в базу данных. Запись добавляет время, дату и IP-адрес в указанную таблицу базы данных.

В настоящее время ничего не происходит при запуске. Скрипт python будет записывать в базу данных только при вызове вручную.


person Sparky3295    schedule 01.06.2019    source источник
comment
У вас могут быть несколько установок Python. Если вы измените python на python3, который у вас есть в заголовке в скрипте python. Или мудрый стих. Или вы можете из терминала запустить $ python -m pip install mysql-connector, чтобы установить mysql-connector для вашей текущей установки python.   -  person Adam    schedule 02.06.2019
comment
Я думаю, что проблема должна быть связана с несколькими версиями. Запуск Python 3 выдает ошибку. После установки модуля я теперь получаю другую ошибку. code Traceback (most recent call last): File "py2db.py", line 10, in <module> ip = ipaddress.get_ipaddress() File "/home/pi/PyScripts/ipaddress.py", line 18, in get_ipaddress return self.get_interface_ipaddress(network) File "/home/pi/PyScripts/ipaddress.py", line 14, in get_interface_ipaddress struct.pack('256s', network[:15]) struct.error: argument for 's' must be a bytes object   -  person Sparky3295    schedule 02.06.2019


Ответы (1)


Кажется, что когда вы запускаете свой скрипт как cronjob, он не может найти правильный PYTHONPATH. Сначала найдите путь к вашему модулю с помощью приведенного ниже сценария:

import os
import mysql
mysql_path = os.path.dirname(mysql.__file__)
print(mysql_path)

Затем добавьте mysql_path к sys.path перед импортом mysql:

#!/usr/bin/python3

from ipaddress import IPAddress
import datetime
import mysql.connector
import sys
sys.path.append('<mysql_path>')


ipaddress = IPAddress()
ip = ipaddress.get_ipaddress()

now = datetime.datetime.now()
time = now.isoformat()
date = now.strftime("%Y-%m-%d")

mydb = mysql.connector.connect(
    host="localhost",
    user="mark",
    passwd="password",
    database="mydb"
)

mycursor = mydb.cursor()

sql = "INSERT INTO piLog (date, time, ip) VALUES (%s, %s, %s)"
val = (date, time, ip)
mycursor.execute(sql, val)

mydb.commit()

print(mycursor.rowcount, "record inserted.")
print("[py2db] - Done.")

sys.exit()
person Masoud Rahimi    schedule 02.06.2019
comment
Спасибо за ответ @М. R. Системный путь, который я получил, используя приведенное выше, был: /home/pi/.local/lib/python2.7/site-packages/mysql. Затем я добавил путь к сценарию следующим образом: import sys sys.path.append ('/home/pi/.local/lib/python2.7/site-packages/mysql') Но все еще есть та же проблема, когда при перезагрузке он не знает, что такое модуль. - person Sparky3295; 02.06.2019
comment
Путь указан для Python2, но ваш скрипт использует Python3. Это проблема. Ваш путь неверен. Попробуйте запустить скрипт с python3 get_mysql_path.py и получите путь для Python3. - person Masoud Rahimi; 02.06.2019
comment
Настройка этого изменила ошибку на: code Initalize IPAddress Traceback (most recent call last): File "py2db.py", line 10, in <module> ip = ipaddress.get_ipaddress() File "/home/pi/PyScripts/ipaddress.py", line 18, in get_ipaddress return self.get_interface_ipaddress(network) File "/home/pi/PyScripts/ipaddress.py", line 14, in get_interface_ipaddress struct.pack('256s', network[:15]) struct.error: argument for 's' must be a bytes object Скрипт по-прежнему работает нормально, просто работая как python. - person Sparky3295; 02.06.2019
comment
Кажется, ваша проблема с импортом mysql решена. Следующая ошибка кажется для модуля ipaddress , я не знаю этот модуль. - person Masoud Rahimi; 02.06.2019
comment
Спасибо за помощь. Похоже, модуль ipaddress, который я использовал, не был совместим с python3. Перешел на другой модуль и все работает. - person Sparky3295; 03.06.2019