Запись в базу данных MySQL при запуске Pi с использованием Python - PullRequest
0 голосов
/ 02 июня 2019

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

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

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

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

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

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

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

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

Код Crontab:

@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 будет записывать в базу данных только при вызове вручную.

1 Ответ

0 голосов
/ 02 июня 2019

Кажется, что когда вы запускаете свой скрипт как 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()
...