[python] SQL request fail, lancé avec cron

Python est le langage de prédilection du Raspberry Pi

Modérateurs : Francois, Manfraid

Répondre
Avatar du membre
Frollo
Messages : 35
Enregistré le : mer. 2 sept. 2015 22:14

[python] SQL request fail, lancé avec cron

Message par Frollo » lun. 25 juin 2018 16:03

J'ai des scripts qui tournent avec différents Raspberry et différents systèmes.
Beaucoup utilisent la bibliothèque MySQLdb comme client SQL.

Récemment j'ai mis une requète SQL en service incluant un "SELECT" au lieur d'un "INSERT".
Le script se lance et fonctionne en IDLE (F5), en console aussi.

Si je le programme avec crontab, ou avec un "executer" qui suit un "sudo chmod +x test.py", eh ben là ça ne marche plus... :shock:

tests infructueux :
- changer le crontab en "sudo crontab -e"
- changer la ligne en "*/1 * * * * sudo /usr/bin/python /home/pi/Documents/mon_test.py..."
- changer de bibliothèque (MySQLdb --> pymysql, dispo avec pip d'ailleur)
- lancer le script avec un script shell
- lancer le script en temps que service

Ci dessous un code test pour un serveur SQL sur le réseau local :

Code : Tout sélectionner

#! /usr/bin/python
# -*- coding: utf-8 -*-

# importations  
import os
import time
import sys
import pymysql as sql  # or MySQLdb as...
from os import path as os_path

#  constants
PATH_THERM = "/home/pi/Documents/" #path to this script
DB_SERVER ='192.168.0.59'       # MySQL : IP server 
DB_USER='user'                    # MySQL : user
DB_PWD='password'              # MySQL : password
DB_BASE='capteurs'              # MySQL : database name

def log(texte):
    datation = time.strftime('%d-%m-%Y %H:%M:%S')

    logue = open('log_test.txt','a')
    txt = "\n" + datation + "\t" + texte
    txt = txt.encode('utf-8')
    logue.write(txt)
    logue.close()

def query_temp():
    datebuff = time.strftime('%d-%m-%Y')

    db = sql.connect(DB_SERVER, DB_USER, DB_PWD, DB_BASE)
    cursor = db.cursor()
    cursor.execute("""SELECT sonde2,date FROM `PiTemp` ORDER BY date DESC LIMIT 0, 1""")
    rows = cursor.fetchall()
    print datebuff, u" : Dernière température de l'eau :", rows[0][0], u"°C"
    log(u"lecture température SQL - ok")

    a = rows[0][0]
    b =  rows[0][1]
    return (a, b)

#             principal code                              
#-------------------------------------
PATH=os_path.abspath(os_path.split(__file__)[0])
os.chdir(PATH)
log('start')
log(PATH)
txt = str(query_temp()[0])
log(txt)
avec le "crontab -e" correspondant :

Code : Tout sélectionner

*/1 * * * * python /home/pi/Documents/180623_test.py

Avatar du membre
Manfraid
Modérateur
Messages : 1402
Enregistré le : ven. 3 oct. 2014 14:50
Contact :

Re: [python] SQL request fail, lancé avec cron

Message par Manfraid » lun. 25 juin 2018 17:13

Bonjour,

pouvez-vous mettre aussi le message d'erreur de python cela avancerai la chose sur le soucis
NAS : DIY OS Debian: DD250Go + 3x2To + 6To
Raspberry pi : 2B OS : Raspbian
Se tromper est humain, Vraiment foutre la merde nécessite le mot de passe de root.

Avatar du membre
Frollo
Messages : 35
Enregistré le : mer. 2 sept. 2015 22:14

Re: [python] SQL request fail, lancé avec cron

Message par Frollo » lun. 25 juin 2018 21:34

Suite à traçage de log (aide de hoonot de Stackoverflow) :

Code : Tout sélectionner

*/1 * * * * python /home/pi/Documents/180623_test.py > /tmp/log_alerte.log 2>&1 
et après quelques épurations, il s'agit d'un problème d'encodage/décodage unicode des messages passés par le cron.

Code : Tout sélectionner

...  print (u"Alerte, tous à poil !") 
UnicodeEncodeError : 'ascii' codec can't encode character u'\xe0' in position 13: ordinal not in range(128)
Etrange, le cron n'encode pas en unicode de la même façon ?...

Résolu en :
(si je supprime tous les charactères accentués des "print", ça fonctionne... (ou en passant les print en "try: print..."))

Avatar du membre
Manfraid
Modérateur
Messages : 1402
Enregistré le : ven. 3 oct. 2014 14:50
Contact :

Re: [python] SQL request fail, lancé avec cron

Message par Manfraid » mar. 26 juin 2018 10:33

Merci d'éditer votre premier post et de le mettre en résolut
NAS : DIY OS Debian: DD250Go + 3x2To + 6To
Raspberry pi : 2B OS : Raspbian
Se tromper est humain, Vraiment foutre la merde nécessite le mot de passe de root.

Répondre

Retourner vers « Python »