python - 使用 Python 在 Pi 启动时写入 MySQL 数据库

标签 python linux raspberry-pi mysql-connector-python startupscript

我的 Raspberry Pi 托管了一个 MySQL 数据库。当我的 Pi 启动时,它运行一个写入数据库的 python 脚本。该脚本将日期、时间和 IP 地址写入数据库。

执行此操作的 python 脚本在从终端运行时运行完美。但是,当我尝试在启动时运行 python 脚本时,什么也没有发生。创建一个 cronjob 来运行 python 脚本向我展示了一个错误正在产生说: “导入错误:没有名为 mysql.connector 的模块”

我只是不确定如果我手动运行它,为什么脚本在启动时不能正常工作。

我尝试直接从 /etc/rc.local 运行脚本 运行方式:

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

我还创建了一个名为 launcher 的 sh 脚本。然后我在 sh 脚本中调用 python 脚本并从 crontab 调用 launcher.sh。启动器脚本背后的想法是,如果我向 Pi 的启动添加更多内容,我可以向该脚本添加 exra 行。

python 脚本在运行 launcher.sh 文件或 py2db.py 文件时正常启动。

我为 contab 创建了一个输出,以查看它尝试运行时会发生什么。

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 脚本只会在手动调用时写入数据库。

最佳答案

当您将脚本作为 cronjob 运行时,它似乎无法找到正确的 PYTHONPATH。首先,使用以下脚本找到您的模块路径:

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

接下来在导入mysql之前将mysql_path添加到sys.path:

#!/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()

关于python - 使用 Python 在 Pi 启动时写入 MySQL 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56410996/

相关文章:

python - python 的文件和异常

python根据条件替换单词

linux - 剪切删除我文件的所有内容

PHP 执行 linux 命令终止得太快?

php - 想通过 php 站点运行我的 Windows 服务器上的 exe 文件

time - 如何保持覆盆子计时准确?

python - Flask 被 OpenCV 卡住

java - 在Python中重写Java BigInteger函数

python - 来自 python,创建数据 block 并通过 SWIG 将其指针传递给 c 程序

python - 如何通过i2c发送数组?