La Fibre

Télécom => Logiciels et systèmes d'exploitation => Linux Linux => Discussion démarrée par: Darkjeje le 06 octobre 2020 à 22:40:40

Titre: Script python lancé en double, pourquoi
Posté par: Darkjeje le 06 octobre 2020 à 22:40:40
Bonjour à tous,

Suite à un plantage de mon raspberry pi, j'ai du tout réinstallé n'ayant pas pensé à l'époque à faire une sauvegarde.

Je rencontre plusieurs problèmes depuis.
Le 1er c'est que mon script Python relatif à ma domotique est lancé deux fois.
Il ne devrait normalement n'être lancé qu'une fois, via un Crontab, or j'ai deux processus, avec pour chacun le processus parent suivant :
Le 1er :   /bin/sh -c sleep 25 && python3 (mon script crontab)
Le 2ème : /sbin/init splash

Je ne m'y connais malheureusement pas assez en Linux pour comprendre comment trouver d'où provient le 2ème lancement et comment y remédier.

Mon second problème, c'est que mon script Python est censé enregistré dans ma base de donnée mysql, tout évènement intervenu sur la domotique de la maison (relevé de température, consommation électrique, allumage/extinction de lumière...), mais la température du bureau ne s'enregistre qu'exceptionnellement.
De plus, certaine commande d'allumage/extinction de lumière ne s'enregistre pas, résultat la base de donnée n'est pas actualisée et je ne peux donc pas utiliser mon site web pour procéder à l'opération inverse d'allumage/exctinction.

Le script python n'a pas évolué, il est excatement le même qu'avant le plantage de mon raspberry. Je suppose donc un problème avec ma base de donnée (accès / ressource processeur...).
Auriez-vous une idée de comment analyser tout ça et y remédier.

Pour info, j'ai testé différent moyen pour remettre ma base de donnée mysql depuis mon ancien raps, en y copiant/collant le contenu du dossier var/lib/mysql. Peut-être ai-je modifier un mauvais paramètre et faudrait-il que je désinstalle proprement mysql et phpmyadmin et tout réinstaller, mais comment ?

Merci par avance pour votre aide !
Titre: Script python lancé en double, pourquoi
Posté par: Darkjeje le 15 octobre 2020 à 14:57:38
Personne ne saurait m'aider ou m'aiguiller vers la solution ?  :-\
Titre: Script python lancé en double, pourquoi
Posté par: kgersen le 15 octobre 2020 à 15:03:41
le point de départ serait de nous communiquer le script python. la on a aucune information utile pour t'aider.

pour tes process, fait "ps faux" (en root ou avec sudo) pour en voir un peu plus.
Titre: Script python lancé en double, pourquoi
Posté par: Darkjeje le 18 octobre 2020 à 14:25:30
le point de départ serait de nous communiquer le script python. la on a aucune information utile pour t'aider.

pour tes process, fait "ps faux" (en root ou avec sudo) pour en voir un peu plus.

Tu as raison kgersen.
Je n'ai plus le doublon de processus, mais je ne sais pas ce qui l'a retiré.
Mon script ci-dessous n'a pas évolué depuis le plantage du rasp, raison pour laquelle je soupçonne plus un manque de ressource du raspberry 1 B+ que j'aurai éventuellement optimisé à l'époque, ou une lenteur/bug dans l'enregistrement dans mysql.

J'ai constaté deux problèmes :
- Le 1er est l'enregistrement très rare de la température du bureau dans mysql, alors qu'elle s'enregistre dans le fichier .txt (commande que je viens de rajouter).
Peut-être est-ce dû à la mauvaise découpe du retour du webserveur, car dans le fichier txt, la température du bureau est anormalement enregistrée sur la même ligne, à la suite de la température de la chambre :
1603022422 18/10/2020 14:00:22 : b'*#4*1*0*0229##' (température du salon)
1603022425 18/10/2020 14:00:25 : b'*#4*2*0*0226##*#4*3*0*0226##' (température de la chambre puis du salon)

- Le 2ème problème, c'est que quand je clique sur l'icône d'allumer la lumière d'une pièce, ma page web se recharge plus vite que l'enregistrement dans ma bdd mysql, du changement de statut de ma lumière (on/off). Résultat ma page web m'indique à tort que la lumière n'est pas allumée. J'avais de mémoire ralenti le temps de chargement de la page web pour laisser le temps à mysql de s'actualiser (ou accélérer mysql). Mais je ne sais plus comment j'ai fait.
Et j'ai l'impression que l'enregistrement de l'état de la lumière ne se fait pas toujours, comme pour la température du bureau.

Voici le script. Je te préviens, je débute totalement sur python, et je n'y ai pas touché depuis des mois (hors ajout mentionné ci-dessus).
Je n'y connais donc pas grand-chose et il m'a fallu des mois pour le créer afin que tout fonctionne, en lisant pas mal de doc sur le web et avec l'aide d'utilisateur de python.
Le script est donc très fortement améliorable, mais comme il fonctionnait bien...

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from datetime import date, timedelta, datetime
import re, time, socket, mysql.connector, os, subprocess, logging

# initialize the log settings
logging.basicConfig(filename='/home/pi/Script_Cron_Domotique/log_Enregistrement_evenements.log',level=logging.DEBUG)

AllLumiere='0#'
Allume='1'
Eteindre='0'
LumiereBureau='22'
LumiereChambre='81'
LumiereCuisinePlafonnier='15'
LumiereCuisinePlanDeTravail='16'
LumiereCouloir='11'
LumiereWC='31'
LumiereSalleDeBainPlafonnier='33'
LumiereSalleDeBainMiroir='24'
LumiereSalon='17'

FenetreTiming='*2*1000#'
AllVolet='*5##'
Stop='0'
Ouverture='1'
Fermeture='2'
VoletBureau='52'
VoletChambre='51'
VoletSalon='57'
VoletBalcon='58'

TemperatureSalon='1'
TemperatureChambre='2'
TemperatureBureau='3'

#Périodes de la variable
today = datetime.now()
Y = str(today.year)
m = str(today.month)
d = str(today.day)
H = str(today.hour)
M = str(today.minute)
S = str(today.second)
Date = time.strftime('%Y-%m-%d %H:%M:%S')
Timestamp = time.time()


#Paramètres de la connexion à la base de données Mysql
config = {
    'user': 'XXXXXXXX',
    'password': 'XXXXXXXX',
    'host': 'localhost',
    'database': 'domotique',}

#Paramètres de connexion à la passerelle BUS/SCS
buffer_size = 2048
ip_F455 = '192.168.XXX.XXX'
port_F455 = XXXXX

#ouverture du socket
try:
    s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((ip_F455,port_F455))
    data=s.recv(buffer_size)
    DataDecode=data.decode('UTF-8')
    print (Date + " : " + DataDecode + " = Retour de connexion")

    s.send(b"*99*1##")#ouverture d'une session COMMAND
    data=s.recv(buffer_size)
    DataDecode=data.decode('UTF-8')
    print (Date + " : " + DataDecode + " = Retour d'ouverture de commande")
    while True:
        data = s.recv(buffer_size)
        DataDecode=data.decode('UTF-8')
        if DataDecode=='':
            s.close()
            break
        else:
            #Périodes de la variable
            today = datetime.now()
            Y = str(today.year)
            m = str(today.month)
            d = str(today.day)
            H = str(today.hour)
            M = str(today.minute)
            S = str(today.second)
            Date = time.strftime('%Y-%m-%d %H:%M:%S')
            Timestamp = time.time()

    # Enregistrement des lumières   
            if DataDecode[0:3] == "*1*":
                if DataDecode[0:8]=="*1*1000#":
                    time.time()
                   
                elif DataDecode[5:7]==AllLumiere:
                    if DataDecode[3:4]==Allume:
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "UPDATE lumiere SET etat = 'ON' "
                        cursor.execute(loggit)
                        conn.commit()
                        cursor.close()
                        conn.close()
                    elif DataDecode[3:4]==Eteindre:
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "UPDATE lumiere SET etat = 'OFF' "
                        cursor.execute(loggit)
                        conn.commit()
                        cursor.close()
                        conn.close()
                       
                elif DataDecode[5:7]==LumiereBureau: # Bureau
                    if DataDecode[3:4]==Allume:
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "UPDATE lumiere SET etat = 'ON' WHERE id_lumiere = '%s' "
                        cursor.execute(loggit%(LumiereBureau))
                        conn.commit()
                        cursor.close()
                        conn.close()
                    elif DataDecode[3:4]==Eteindre:
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "UPDATE lumiere SET etat = 'OFF' WHERE id_lumiere = '%s' "
                        cursor.execute(loggit%(LumiereBureau))
                        conn.commit()
                        cursor.close()
                        conn.close()
                       
                elif DataDecode[5:7]==LumiereChambre: # Chambre
                    if DataDecode[3:4]==Allume:
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "UPDATE lumiere SET etat = 'ON' WHERE id_lumiere = '%s' "
                        cursor.execute(loggit%(LumiereChambre))
                        conn.commit()
                        cursor.close()
                        conn.close()
                    elif DataDecode[3:4]==Eteindre:
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "UPDATE lumiere SET etat = 'OFF' WHERE id_lumiere = '%s' "
                        cursor.execute(loggit%(LumiereChambre))
                        conn.commit()
                        cursor.close()
                        conn.close()
                       
                elif DataDecode[5:7]==LumiereCuisinePlafonnier: # Cuisine plafonnier
                    if DataDecode[3:4]==Allume:
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "UPDATE lumiere SET etat = 'ON' WHERE id_lumiere = '%s' "
                        cursor.execute(loggit%(LumiereCuisinePlafonnier))
                        conn.commit()
                        cursor.close()
                        conn.close()
                    elif DataDecode[3:4]==Eteindre:
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "UPDATE lumiere SET etat = 'OFF' WHERE id_lumiere = '%s' "
                        cursor.execute(loggit%(LumiereCuisinePlafonnier))
                        conn.commit()
                        cursor.close()
                        conn.close()
                       
                elif DataDecode[5:7]==LumiereCuisinePlanDeTravail: # Cuisine Plan de travail
                    if DataDecode[3:4]==Allume:
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "UPDATE lumiere SET etat = 'ON' WHERE id_lumiere = '%s' "
                        cursor.execute(loggit%(LumiereCuisinePlanDeTravail))
                        conn.commit()
                        cursor.close()
                        conn.close()
                    elif DataDecode[3:4]==Eteindre:
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "UPDATE lumiere SET etat = 'OFF' WHERE id_lumiere = '%s' "
                        cursor.execute(loggit%(LumiereCuisinePlanDeTravail))
                        conn.commit()
                        cursor.close()
                        conn.close()

                elif DataDecode[5:7]==LumiereCouloir: # Couloir
                    if DataDecode[3:4]==Allume:
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "UPDATE lumiere SET etat = 'ON' WHERE id_lumiere = '%s' "
                        cursor.execute(loggit%(LumiereCouloir))
                        conn.commit()
                        cursor.close()
                        conn.close()
                    elif DataDecode[3:4]==Eteindre:
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "UPDATE lumiere SET etat = 'OFF' WHERE id_lumiere = '%s' "
                        cursor.execute(loggit%(LumiereCouloir))
                        conn.commit()
                        cursor.close()
                        conn.close()
                       
                elif DataDecode[5:7]==LumiereWC: # WC
                    if DataDecode[3:4]==Allume:
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "UPDATE lumiere SET etat = 'ON' WHERE id_lumiere = '%s' "
                        cursor.execute(loggit%(LumiereWC))
                        conn.commit()
                        cursor.close()
                        conn.close()
                    elif DataDecode[3:4]==Eteindre:
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "UPDATE lumiere SET etat = 'OFF' WHERE id_lumiere = '%s' "
                        cursor.execute(loggit%(LumiereWC))
                        conn.commit()
                        cursor.close()
                        conn.close()

                elif DataDecode[5:7]==LumiereSalleDeBainPlafonnier: # Salle de Bain Plafonnier
                    if DataDecode[3:4]==Allume:
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "UPDATE lumiere SET etat = 'ON' WHERE id_lumiere = '%s' "
                        cursor.execute(loggit%(LumiereSalleDeBainPlafonnier))
                        conn.commit()
                        cursor.close()
                        conn.close()
                    elif DataDecode[3:4]==Eteindre:
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "UPDATE lumiere SET etat = 'OFF' WHERE id_lumiere = '%s' "
                        cursor.execute(loggit%(LumiereSalleDeBainPlafonnier))
                        conn.commit()
                        cursor.close()
                        conn.close()

                elif DataDecode[5:7]==LumiereSalleDeBainMiroir: # Salle de Bain Miroir
                    if DataDecode[3:4]==Allume:
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "UPDATE lumiere SET etat = 'ON' WHERE id_lumiere = '%s' "
                        cursor.execute(loggit%(LumiereSalleDeBainMiroir))
                        conn.commit()
                        cursor.close()
                        conn.close()
                    elif DataDecode[3:4]==Eteindre:
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "UPDATE lumiere SET etat = 'OFF' WHERE id_lumiere = '%s' "
                        cursor.execute(loggit%(LumiereSalleDeBainMiroir))
                        conn.commit()
                        cursor.close()
                        conn.close()
                       
                elif DataDecode[5:7]==LumiereSalon: # Salon
                    if DataDecode[3:4]==Allume:
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "UPDATE lumiere SET etat = 'ON' WHERE id_lumiere = '%s' "
                        cursor.execute(loggit%(LumiereSalon))
                        conn.commit()
                        cursor.close()
                        conn.close()
                    elif DataDecode[3:4]==Eteindre:
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "UPDATE lumiere SET etat = 'OFF' WHERE id_lumiere = '%s' "
                        cursor.execute(loggit%(LumiereSalon))
                        conn.commit()
                        cursor.close()
                        conn.close()
         
                else:
                    print (Date + " : " + DataDecode + " = Commande Lumiere non prise en compte")
                    #Connexion à la Bdd mysql
                    conn = mysql.connector.connect(**config)
                    cursor = conn.cursor()
                    loggit = "INSERT INTO commande_inconnue (date_releve, commande) VALUES (%s, %s)"
                    cursor.execute(loggit, (Date, DataDecode))
                    conn.commit()
                    cursor.close()
                    conn.close()
La suite dans un second poste, j'ai atteint la limite en caractère...
Titre: Script python lancé en double, pourquoi
Posté par: Darkjeje le 18 octobre 2020 à 14:32:35
# Enregistrement des températures ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
            elif DataDecode[0:4] == "*#4*":
                time.time()
                Date = time.strftime("%Y-%m-%d %H:%M:%S")
                Timestamp = time.time()
                if DataDecode[4:5]==TemperatureSalon:
                    if DataDecode[6:7]=="0":
                        TemperatureSalonReleve = float(DataDecode[8:12])/10
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "INSERT INTO température_salon (date_releve, temp_salon, timemysql, jour) VALUES (%s, %s, %s, %s)"
                        cursor.execute(loggit, (Date, TemperatureSalonReleve, int(Timestamp), Date))
                        conn.commit()
                        cursor.close()
                        conn.close()
                       
                        timestamp = int(time.time())
                        mon_fichier = open("/home/pi/Script_Cron_Domotique/Logtemp.txt", "a") #Ouverture/écriture en mode ajout
                        mon_fichier.write(str(timestamp) + " " + time.strftime("%d/%m/%Y %H:%M:%S")+" : "+str(data))
                        mon_fichier.write("\n")
                        mon_fichier.close()

                    else: # Commande température non prise en compte
                        print (Date + " : " + DataDecode + " = Commande température inconnu non prise en compte")
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "INSERT INTO commande_inconnue (date_releve, commande) VALUES (%s, %s)"
                        cursor.execute(loggit, (Date, DataDecode))
                        conn.commit()
                        cursor.close()
                        conn.close()

                   
                elif DataDecode[4:5]==TemperatureChambre:
                    if DataDecode[6:7]=="0":
                        TemperatureChambreReleve = float(DataDecode[8:12])/10                   
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "INSERT INTO température_chambre (date_releve, temp_chambre, timemysql, jour) VALUES (%s, %s, %s, %s)"
                        cursor.execute(loggit, (Date, TemperatureChambreReleve, int(Timestamp), Date))
                        conn.commit()
                        cursor.close()
                        conn.close()
                       
                        timestamp = int(time.time())
                        mon_fichier = open("/home/pi/Script_Cron_Domotique/Logtemp.txt", "a") #Ouverture/écriture en mode ajout
                        mon_fichier.write(str(timestamp) + " " + time.strftime("%d/%m/%Y %H:%M:%S")+" : "+str(data))
                        mon_fichier.write("\n")
                        mon_fichier.close()

                    else: # Commande température non prise en compte
                        print (Date + " : " + DataDecode + " = Commande Temperature chambre non prise en compte du tout")
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "INSERT INTO commande_inconnue (date_releve, commande) VALUES (%s, %s)"
                        cursor.execute(loggit, (Date, DataDecode))
                        conn.commit()
                        cursor.close()
                        conn.close()


                elif DataDecode[4:5]==TemperatureBureau:
                    if DataDecode[6:7]=="0":
                        TemperatureBureauReleve = float(DataDecode[8:12])/10
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "INSERT INTO température_bureau (date_releve, temp_bureau, timemysql, jour) VALUES (%s, %s, %s, %s)"
                        cursor.execute(loggit, (Date, TemperatureBureauReleve, int(Timestamp), Date))
                        conn.commit()
                        cursor.close()
                        conn.close()
                       
                        timestamp = int(time.time())
                        mon_fichier = open("/home/pi/Script_Cron_Domotique/Logtemp.txt", "a") #Ouverture/écriture en mode ajout
                        mon_fichier.write(str(timestamp) + " " + time.strftime("%d/%m/%Y %H:%M:%S")+" : "+str(data))
                        mon_fichier.write("\n")
                        mon_fichier.close()

                    else: # Commande température non prise en compte
                        print (Date + " : " + DataDecode + " = Commande Temperature bureau non prise en compte")
                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = "INSERT INTO commande_inconnue (date_releve, commande) VALUES (%s, %s)"
                        cursor.execute(loggit, (Date, DataDecode))
                        conn.commit()
                        cursor.close()
                        conn.close()
                       
                else: # Commande température non prise en compte
                    print (Date + " : " + DataDecode + " = Commande Temperature non prise en compte")
                    #Connexion à la Bdd mysql
                    conn = mysql.connector.connect(**config)
                    cursor = conn.cursor()
                    loggit = "INSERT INTO commande_inconnue (date_releve, commande) VALUES (%s, %s)"
                    cursor.execute(loggit, (Date, DataDecode))
                    conn.commit()
                    cursor.close()
                    conn.close()

    s.close()
except Exception as e:
    logging.exception("\n"+"\n"+'Erreur_Enregist_events : ' + time.strftime("%d/%m/%Y à %H:%M:%S")+"\n" + str(e)+"\n"+"\n")
N’hésite pas si tu as des questions, suggestions...

Le script en lui-même ne plante pas, j'en ai un autre qui test son fonctionnement et le relance si nécessaire.

Merci

Jérémy
Titre: Script python lancé en double, pourquoi
Posté par: kgersen le 18 octobre 2020 à 16:08:28
hum effectivement c'est du script de débutant mais faut bien commencer un jour :)

déjà je vois un premier souci: tu assumes qu'a chaque tour de boucle (le 'while True'), il n'y a qu'un seul évènement reçu. Tu n'itère pas sur 'data' pour voir combien il contient d'évènements tu pars du principe qu'il y en a toujours qu'un. C'est peut-être pour cela que la temp du salon est ignorée : on dirait qu'elle est envoyé en même temps (dans le meme 'data') que celle de la chambre.

on le voit bien sur la ligne:

1603022425 18/10/2020 14:00:25 : b'*#4*2*0*0226##*#4*3*0*0226##' (température de la chambre puis du salon)
ca correspond a
mon_fichier.write(str(timestamp) + " " + time.strftime("%d/%m/%Y %H:%M:%S")+" : "+str(data))donc
data = *#4*2*0*0226##*#4*3*0*0226##
il y a donc bien 2 évènements dans un même 'data' mais ta boucle ne gère qu'un évènement a la fois.

il te faut introduire une 2eme boucle dans ta boucle principale; pour 'parser' tous les évènements de la variable "data" a chaque (a priori '##' est le délimiteur d'évènement). Vu que tu importe deja 're', tu peux utiliser par exemple re.split("##",data) pour itérer ensuite dessus.

Je te conseille fortement d'utiliser des fonctions dans ton code, tu répète beaucoup de code pour rien. Il y a plein d'autre petits défauts inhérent a un débutant mais ce n'est pas critique.
Egalement coté structure SQL, tu n'a pas besoin d'une table de température par piece, tu peut avoir une seul table 'temperature' avec un champ en plus qui est le nom de la pièce.

Mais bon ces derniers points ne sont pas primordiaux au bon fonctionnement, le 1er l'est.

Titre: Script python lancé en double, pourquoi
Posté par: Darkjeje le 18 octobre 2020 à 16:54:58
il y a donc bien 2 évènements dans un même 'data' mais ta boucle ne gère qu'un évènement a la fois.

il te faut introduire une 2eme boucle dans ta boucle principale; pour 'parser' tous les évènements de la variable "data" a chaque (a priori '##' est le délimiteur d'évènement). Vu que tu importe deja 're', tu peux utiliser par exemple re.split("##",data) pour itérer ensuite dessus.

Merci pour ton analyse kgersen.

En fait, j'ai beaucoup de mal à comprendre le principe des objets dans Python, je me suis arrêté au début dans la programmation, car je ne pouvais gérer la reprise de mes études en cours du soir, plus le boulot, et l'apprentissage de Python.

La partie ci-dessous
Citer
while True:
        data = s.recv(buffer_size)
        DataDecode=data.decode('UTF-8')
        if DataDecode=='':
            s.close()
            break
        else:
m'a été conseillé par des utilisateurs, car je ne savais pas (et ne sais toujours pas), comment récupérez la variable transmise par mon serveur domotique, la découper avec en effet le dénominateur suivant "##" afin de pouvoir ensuite traiter chaque retour séparé en fonction de sa structure.

Je vais me remettre à Python et essayer de corriger cela.

Merci kgersen
Titre: Script python lancé en double, pourquoi
Posté par: kgersen le 18 octobre 2020 à 17:37:28
Je te recommande d'apprendre les fonctions (https://courspython.com/fonctions.html) et d'en mettre dans ton script, tu devrait passer de plus de 400 lignes a moins de 200...

Ainsi que les dictionnaires (https://courspython.com/dictionnaire.html), très utiles ici aussi.

Et tu n'a pas besoin d'apprendre la notion d'objet (au sens programmation orienté objet (POO), OOP en anglais).
Du procédurale simple avec fonctions et éventuellement dictionnaires suffit.

Exemple de fonction. Partout ou tu as:

                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = " ..... "
                        cursor.execute(loggit)
                        conn.commit()
                        cursor.close()
                        conn.close()


remplace par
                        loggit = " ..... "
                        commandeSQL(loggit)


et defini la fonction commandeSQL avant le try: principale :

# se connecte et exécute 'commande' sur le serveur sql
def commandeSQL(commande):
  conn = mysql.connector.connect(**config)
  cursor = conn.cursor()
  cursor.execute(commande)
  conn.commit()
  cursor.close()
  conn.close()

#ouverture du socket
try:
....


rien qu'avec ce changement tu vas gagner plus de 100 lignes qui sont répétées pour rien. Ton script sera nettement plus lisible.
Titre: Script python lancé en double, pourquoi
Posté par: Darkjeje le 18 octobre 2020 à 17:59:41
Je te recommande d'apprendre les fonctions (https://courspython.com/fonctions.html) et d'en mettre dans ton script, tu devrait passer de plus de 400 lignes a moins de 200...

Ainsi que les dictionnaires (https://courspython.com/dictionnaire.html), très utiles ici aussi.

Et tu n'a pas besoin d'apprendre la notion d'objet (au sens programmation orienté objet (POO), OOP en anglais).
Du procédurale simple avec fonctions et éventuellement dictionnaires suffit.

Exemple de fonction. Partout ou tu as:

                        #Connexion à la Bdd mysql
                        conn = mysql.connector.connect(**config)
                        cursor = conn.cursor()
                        loggit = " ..... "
                        cursor.execute(loggit)
                        conn.commit()
                        cursor.close()
                        conn.close()


remplace par
                        loggit = " ..... "
                        commandeSQL(loggit)


et defini la fonction commandeSQL avant le try: principale :

# se connecte et exécute 'commande' sur le serveur sql
def commandeSQL(commande):
  conn = mysql.connector.connect(**config)
  cursor = conn.cursor()
  cursor.execute(commande)
  conn.commit()
  cursor.close()
  conn.close()

#ouverture du socket
try:
....


rien qu'avec ce changement tu vas gagner plus de 100 lignes qui sont répétées pour rien. Ton script sera nettement plus lisible.

Merci kgersen, c'est très clair par ton exemple.

De mon côté j'ai lancé mon script sur mon rasp en ligne de commande et le même (mais sans la partie enregistrement, seulement un print après le try), et je constate que le raps met 3 à 5 secondes pour afficher la commande, contre un affichage instantanné sur mon PC.
Il y a donc surement un problème de ressource sur le rasp.
Tout à l'heure le site web ne s'affichait pas, le rasp était super lent et m'a mis plusieurs dizaines de second avant d'afficher la demande de mot de passe pour ma connexion ssh.

Il y a donc un problème de parsing dans mon script et un problème de ressource sur le rasp qui ne fait pourtant que reverse proxy nginX, script python et site web mono utilisateur.
Titre: Script python lancé en double, pourquoi
Posté par: kgersen le 18 octobre 2020 à 20:33:50
Il y a donc un problème de parsing dans mon script et un problème de ressource sur le rasp qui ne fait pourtant que reverse proxy nginX, script python et site web mono utilisateur.

je ne vois rien d'inquiétant dans le script concernant les performances si ce n'est que tu ouvre & ferme une connexion SQL pour chaque écriture en base. Si le flot d'évènements est faible ca ne doit pas poser de problème. A moins d'un memory leak ?

Il faut diagnostiquer ce qui se passe dans le Pi, notamment l'utilisation de la mémoire et du cpu. La commande 'top' est la base pour cela, ou sinon installer 'htop' ou mieux encore 'glances'.

C'est quel soft qui fait le site web mono utilisateur ?

Apres un Pi 1b c'est peut-être trop leger pour tout cela  quand meme.
Titre: Script python lancé en double, pourquoi
Posté par: kazyor le 18 octobre 2020 à 21:20:42
Apres un Pi 1b c'est peut-être trop leger pour tout cela  quand meme.

Quand même ...
Nginx + pi-hole + MQTT + Zigbee2MQTT + qqs scripts basiques en cron + tunnel SSH, ça tient la charge sans problème.
Titre: Script python lancé en double, pourquoi
Posté par: kgersen le 18 octobre 2020 à 21:32:39
Quand même ...
Nginx + pi-hole + MQTT + Zigbee2MQTT + qqs scripts basiques en cron + tunnel SSH, ça tient la charge sans problème.

Oui d'où ma question 'quel soft qui fait le site web mono utilisateur'. On ne sait pas trop ce qui tourne dans son Pi.

Titre: Script python lancé en double, pourquoi
Posté par: Darkjeje le 18 octobre 2020 à 22:59:32
je ne vois rien d'inquiétant dans le script concernant les performances si ce n'est que tu ouvre & ferme une connexion SQL pour chaque écriture en base. Si le flot d'évènements est faible ca ne doit pas poser de problème. A moins d'un memory leak ?

Il faut diagnostiquer ce qui se passe dans le Pi, notamment l'utilisation de la mémoire et du cpu. La commande 'top' est la base pour cela, ou sinon installer 'htop' ou mieux encore 'glances'.

C'est quel soft qui fait le site web mono utilisateur ?

Après un Pi 1b c'est peut-être trop léger pour tout cela quand même.

J'ai créé mon site même, sans passer par un soft, juste en programmant en php/css.

Le Pi 1B est certes léger, mais cela a fonctionné pendant des années, mais peut-être avais-je optimisé un paramètre, que ce soit sur le rasp en général ou pour mysql.

La commande top me renvoi une très faible utilisation du processeur, ainsi que de la RAM.

J'ai pu alléger en partie mon script mais je suis bloqué pour des requêtes mysql d'insertion faisant appel à d'autres variables.

Avant j'avais ceci :
#Connexion à la Bdd mysql
                cursor = conn.cursor()
                loggit = "INSERT INTO commande_inconnue (date_releve, commande) VALUES (%s, %s)"
                cursor.execute(loggit, (Date, DataDecode))
                conn.commit()
                cursor.close()
                conn.close()

car les variables à insérer dans la bdd doivent être inscrite via VALUES (%s, %s), puis appelées dans cursor.execute(loggit, (Date, DataDecode)).
Mais je ne parviens pas à le faire avec une fonction et je ne trouve pas de doc sur comment intégrer des variables dans une requête sql via une fonction.
Celle où je pense me rapprocher le plus est celle-ci, car la valeur transmise n'est pas bonne, mais au moins c'est une erreur sql et non python :
loggit = "INSERT INTO température_demandée (date_releve, pièce, température, timemysql, jour) VALUES (%s, %s, %s, %s, %s)"
commandeSQL(loggit%(Date, int(3), TemperatureBureauDemandee, int(Timestamp), Date)) #ProgrammingError: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '21:48:27, 3, 16.0, 1603050507, 2020-10-18 21:48:27)' at line 1

Malgré toutes mes tentatives, j'obtiens toujours une erreur :
TypeError: commandeSQL() takes 1 positional argument but 6 were given
TypeError: not enough arguments for format string
SyntaxError: invalid syntax
AttributeError: 'tuple' object has no attribute 'encode'

Je ne sais pas si je dois créer une fonction contenant plusieurs paramètres, ou si c'est la manière de coder les infos à transmettre qui n'est pas bon.
Titre: Script python lancé en double, pourquoi
Posté par: Darkjeje le 18 octobre 2020 à 23:07:28
Oui d'où ma question 'quel soft qui fait le site web mono utilisateur'. On ne sait pas trop ce qui tourne dans son Pi.

Actuellement sur mon pi j'ai ceci :
- Nginx : reverse-proxy ssl let'sencrypt pour 4 sous-domaines (un localhost et 3 accès sur d'autres périphériques du réseau)
- Apache2 : mon site web créé de toute pièce en php/xhtml-css) (le localhost ci-dessus)
- Webmin : pour l'interface graphique du Rasp
- des scripts python pour la domotique (tous lancé via crontab, mais un seul tourne en permanence, celui que l'on regarde actuellement). Les autres sont des MAJ d'horaire du serveur domotique, de vérif du bon fonctionnement du script tournant h24, de MAJ de la bdd une fois par jours...)
- Wireguard (merci à toi kgersen !) Mais il va falloir que je m'y remette dessus, car ipv6 ne fonctionne tjrs pas sur mon Windows10 alors qu'avec les mêmes paramètres il fonctionne sur mon Samsung S8 et que j'ai toujours pas accès à mes périphériques réseaux une fois activé depuis W10, alors que cela fonctionne là aussi avec mon S8.

Et il faudra que je réinstalle RF24 afin d'avoir un 2ème script python qui tourne h24 pour récupérer la température/humidité d'un mini arduino.

Rien de bien méchant, en sommes, et tout fonctionnait parfaitement il y a de ça quelques mois. :(
Titre: Script python lancé en double, pourquoi
Posté par: Darkjeje le 18 octobre 2020 à 23:17:34
Je viens de lancer un script python basique
#!/usr/bin python3
# coding: utf8
from datetime import date, timedelta, datetime
import re, time, socket, mysql.connector

#Paramètres de la connexion à la base de données Mysql
config = {
    'user': 'XXXXX',
    'password': 'XXXXX',
    'host': 'localhost',
    'database': 'domotique',}

#Périodes de la variable
time.localtime()
Commande = '*#18*51*511#'
Dieze = '#'
yesterday = date.today() - timedelta(1)
Mois = '10' # date à modifier pour les imports manuels !
Jour = '19' # date à modifier pour les imports manuels !
string_date = time.strftime("%Y-" + Mois + "-" + Jour + " " + "0:0:0.00000")
date = datetime.strptime(string_date, "%Y-%m-%d %H:%M:%S.%f")
Timestamp = time.mktime(date.timetuple())

Message = Commande + Mois + Dieze + Jour + Dieze + Dieze

#Paramètres de connexion à la passerelle BUS/SCS
buffer_size =2048 #Taille du buffer se référer à la doc python sur les socket
ip_F455='192.168.XXX.XXX' #@IP de la passerelle
port_F455=XXXXX #Port pour commande opennwebnet

#ouverture du socket
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip_F455,port_F455))
data=s.recv(buffer_size)
DataDecode=data.decode('UTF-8')
print (DataDecode + " = Retour de connexion")

s.send(b"*99*9##")#ouverture d'une session COMMAND
data=s.recv(buffer_size)
DataDecode=data.decode('UTF-8')
print (DataDecode + " = Retour d'ouverture de commande")

MessageEncode = Message.encode('UTF-8')
s.send(MessageEncode)
print (Message + " = Commande envoyée")

retour = ""
 
while True:
    try:
        data=s.recv(buffer_size)
        if data:
            retour += data.decode('UTF-8')
            if retour[-6:] == "*#*1##":
                break
        else:
            s.close()
            break
    except:
        print("error")
        s.close()
        break
 
data = {}
   
pattern = "(\*\#\d+\*\d+\*\d+#\d+\#\d+\*\d+\*\d+\#{2})"
for result in re.findall(pattern, retour):
    result = result[2:-2].split("#")[2].split("*")
    heure = int(result[1])
    conso = int(result[2])
    data[heure] = conso
    print (heure)
    print (conso)
    #Connexion à la Bdd mysql
    conn = mysql.connector.connect(**config)
    cursor = conn.cursor()
 
    # Ajout d'une ligne dans la Bdd
    loggit = "INSERT INTO consommation (date_releve, timemysql, heure, watt_heure) VALUES (%s, %s, %s, %s)"
    cursor.execute(loggit, (date, Timestamp, heure, conso))
    conn.commit()
    cursor.close()
    conn.close()
Il permet de mettre à jour manuellement la conso électrique de la journée (saisi du jour et du mois dans le script).
Normalement il faut 2 secondes pour avoir les deux premières lignes (connexion et retour ACK du serveur domotique), puis en grand max 2 secondes j'ai les 25 données (1 par heure + un total).
Là il me faut plus d'une seconde pour avoir chaque retour horaire.
Avec la commande top sur une autre fenêtre ssh, j'ai le processus python par moment entre 20 et 50, mais je ne m'approche pas des 100 même avec plusieurs processus.
Peut-être que la commande top, est pas top... pour voir en direct.

Edit :
Le problème vient de mysql.
Si je lance ce même script mais sans l'enregistrement dans mysql, j'obtiens les résultats en 6,28 secondes, contre 41,81 secondes avec l'enregistrement dans mysql...
Titre: Script python lancé en double, pourquoi
Posté par: kgersen le 19 octobre 2020 à 00:12:51
pour la fonction commandeSQL, adapte la pour qu'elle soit comme cursor.execute donc avec un deuxieme parametre optionnel pour passer des valeurs dans un tuple.

def commandeSQL(commande, valeurs=None):
  conn = mysql.connector.connect(**config)
  cursor = conn.cursor()
  cursor.execute(commande, valeurs)
  conn.commit()
  cursor.close()
  conn.close()
comme ca tu peux appeler commandeSQL avec un ou 2 parametres suivant les cas.

Pour le reste:
Donc ton serveur sql est aussi sur le Pi  vu que tu utilises 'localhost' dans "config".
c'est en général ce qui consomme le plus.

vu que tu as webmin tu dois pouvoir voir les stats du Pi, mémoire et cpu. regarde aussi les logs sql.

si ok niveau systeme fait un test manuel en sql direct (ligne de commande) ou via une UI style HeidiSQL pour voir ce qui se passe.
t'as peut-être une table trop grosse non indexée ou un truc du genre.

Titre: Script python lancé en double, pourquoi
Posté par: Darkjeje le 19 octobre 2020 à 22:10:18
Quand même ...
Nginx + pi-hole + MQTT + Zigbee2MQTT + qqs scripts basiques en cron + tunnel SSH, ça tient la charge sans problème.

Salut kazyor,

Tu as un Pi 1b+ ?
Si oui, tu pourrais faire un test avec la commande suivante "SELECT benchmark(100000000,1+2);" en ligne de commande que je puisse comparer avec le mien ?
J'obtiens :
pi@raspberrypi:~ $ mysql -u XXXXX -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 233
Server version: 10.3.23-MariaDB-0+deb10u1 Raspbian 10

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> SELECT benchmark(100000000,1+2);
+--------------------------+
| benchmark(100000000,1+2) |
+--------------------------+
|                        0 |
+--------------------------+
1 row in set (1 min 14.436 sec)

Ce n'est pas glorieux, mais les temps indiqués sur Internet sont pour des config de pc ou vrai serveur, exemple :
- AMD 64 3200+ : 4.92 sec
- Intel Pentium 4 Dual Core (3.20 GHz) : 3.76 sec
- Intel Xeon Bi-processeurs (3.00 GHz) : 3.43 sec


pour la fonction commandeSQL, adapte la pour qu'elle soit comme cursor.execute donc avec un deuxieme parametre optionnel pour passer des valeurs dans un tuple.

def commandeSQL(commande, valeurs=None):
  conn = mysql.connector.connect(**config)
  cursor = conn.cursor()
  cursor.execute(commande, valeurs)
  conn.commit()
  cursor.close()
  conn.close()
comme ca tu peux appeler commandeSQL avec un ou 2 parametres suivant les cas.

Merci kgersen, je n'avais pas pensé à mettre le valeurs=none, j'avais seulement mis un mot quelconque.

Citer
Pour le reste:
Donc ton serveur sql est aussi sur le Pi  vu que tu utilises 'localhost' dans "config".
c'est en général ce qui consomme le plus.

Oui le serveur sql est sur le rasp, c'est vrai que j'ai oublié de le mentionner. C'était déjà le cas avant qu'il plante.

Citer

vu que tu as webmin tu dois pouvoir voir les stats du Pi, mémoire et cpu. regarde aussi les logs sql.

si ok niveau systeme fait un test manuel en sql direct (ligne de commande) ou via une UI style HeidiSQL pour voir ce qui se passe.
t'as peut-être une table trop grosse non indexée ou un truc du genre.

Je regarderai plus tard comment lire les stats et les logs.
Je viens de corriger tout mon script pour supprimer un max de ligne. Je suis passé de 1 395 à 989 lignes, soit 406 lignes d'économisées rien qu'avec une fonction.
J'analiserai plus tard si je peux encore améliorer la chose, merci beaucoup ! C'est beaucoup plus court et claire !

Ma bdd fait plus de 33 Mo, les plus grosses tables font plus de 138 000 lignes pour 4,5 Mo (une température toutes les 15 mn depuis juin 2017).
Je pense que je vais supprimer des entrées afin de ne garder que 24 températures par jours après une certaine durée d'historique (6 mois, 1 an ou autre).
Titre: Script python lancé en double, pourquoi
Posté par: Darkjeje le 20 octobre 2020 à 23:07:23
J'ai réussi à corriger mon problème d'enregistrement de la température du bureau grace à une boucle for et re.split.

Merci pour cette solution kgersen !

Il me reste à essayer d'intégrer le relevé de consommation dans ce script python et surtout à comprendre pourquoi c'est si lent.
Titre: Script python lancé en double, pourquoi
Posté par: Darkjeje le 23 octobre 2020 à 18:25:24
Comme certain semble l'avoir constaté sur d'autre forum, Python 3.x est beaucoup plus lent que Python 2.x.
Pour mon relevé de consommation horaire, soit 25 valeurs, j'obtiens les temps suivants :
Python 3.7 : 67,05 secondes
Python 2.7 : 4,17 secondes.

Ce poste en parle https://webdevdesigner.com/q/why-is-python-3-is-considerably-slower-than-python-2-duplicate-72236/ (https://webdevdesigner.com/q/why-is-python-3-is-considerably-slower-than-python-2-duplicate-72236/), mais je ne vois pas ce que je peux faire pour corriger cela avec Python 3.x

Vous auriez une idée, mis à part repasser sur Python 2.7 ?
Titre: Script python lancé en double, pourquoi
Posté par: kgersen le 23 octobre 2020 à 19:41:49
essai de 'profiler' pour voir ou ce situe le problème:

python3 -m cProfile -s tottime tonscript.py
Titre: Script python lancé en double, pourquoi
Posté par: Darkjeje le 23 octobre 2020 à 23:41:04
essai de 'profiler' pour voir ou ce situe le problème:

python3 -m cProfile -s tottime tonscript.py


J'avais vu cela en cherchant des infos sur internet, mais je ne vois pas comment interpréter les infos qui en ressortent.
Entre temps, j'ai pas mal optimisé mon script, bien que je n'ai pas encore réussi à faire une fonction pour la lecture ou l'update mysql, mais j'ai pas encore assez essayer.
Et j'ai pu intégrer la conso électrique par heure dans le script.

J'ai mis à jour pip et pip3, ainsi que mysql.connector en version 8.0.22 pour python2.7 et python3.x, mais pas de changement.

Python2.7 est suffisament réactif pour que la bdd soit mise à jour avant le rechargement de la page web déclenchant l'allumage/extionction de la lumière.
Il me reste donc à obtenir de même avec python3.

Ce qui est étrange c'est que je n'avais pas cette lenteur avant en python3.

Merci encore kgersen pour toute ton aide.
Titre: Script python lancé en double, pourquoi
Posté par: kgersen le 24 octobre 2020 à 11:17:42
J'avais vu cela en cherchant des infos sur internet, mais je ne vois pas comment interpréter les infos qui en ressortent.

affiche le resultat ici.
Titre: Script python lancé en double, pourquoi
Posté par: Darkjeje le 25 octobre 2020 à 19:19:39
affiche le resultat ici.
Merci pour ton analyse kgersen !

Ordered by: internal time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
      504 4461.923    8.853 4461.923    8.853 {method 'recv' of '_socket.socket' objects}
       53  134.106    2.530  134.106    2.530 {method 'read' of '_io.BufferedReader' objects}
      418    1.856    0.004    1.856    0.004 {method 'sendall' of '_socket.socket' objects}
       54    1.359    0.025    1.359    0.025 {built-in method posix.read}
      142    0.629    0.004    0.629    0.004 {built-in method builtins.print}
       54    0.494    0.009    0.494    0.009 {method 'connect' of '_socket.socket' objects}
       54    0.229    0.004    2.353    0.044 subprocess.py:1383(_execute_child)
       54    0.219    0.004    0.219    0.004 {built-in method _posixsubprocess.fork_exec}
       47    0.176    0.004    0.176    0.004 {built-in method marshal.loads}
       54    0.152    0.003    0.152    0.003 {built-in method posix.waitpid}
      442    0.146    0.000    1.410    0.003 network.py:258(recv_plain)
      530    0.141    0.000    0.190    0.000 posixpath.py:75(join)
       53    0.122    0.002    0.203    0.004 {built-in method _socket.getaddrinfo}
   137/38    0.110    0.001    0.335    0.009 sre_parse.py:475(_parse)
     8525    0.100    0.000    0.107    0.000 {built-in method builtins.isinstance}
        1    0.093    0.093 4606.402 4606.402 Enregistrement_evenements.py:3(<module>)
        4    0.090    0.022    0.114    0.028 {built-in method _imp.create_dynamic}
   262/34    0.074    0.000    0.178    0.005 sre_compile.py:71(_compile)
      530    0.074    0.000    0.309    0.001 subprocess.py:1442(<genexpr>)
      108    0.066    0.001    0.073    0.001 {built-in method io.open}
      315    0.066    0.000    2.879    0.009 connection.py:347(_send_cmd)
      531    0.066    0.000    0.101    0.000 os.py:803(fsencode)
       53    0.066    0.001  137.136    2.587 abstracts.py:365(config)
       16    0.064    0.004    0.165    0.010 enum.py:135(__new__)
      298    0.062    0.000    0.062    0.000 {built-in method posix.stat}
      365    0.061    0.000    0.114    0.000 protocol.py:241(parse_ok)
      418    0.057    0.000    0.073    0.000 network.py:74(_prepare_packets)
      131    0.057    0.000    0.172    0.001 <frozen importlib._bootstrap_external>:1356(find_spec)
       53    0.057    0.001    0.057    0.001 {method 'flush' of '_io.TextIOWrapper' objects}
      152    0.056    0.000    0.275    0.002 {built-in method builtins.__build_class__}
     2454    0.055    0.000    0.055    0.000 sre_parse.py:233(__next)
     1930    0.053    0.000    0.053    0.000 {method 'encode' of 'str' objects}
       53    0.053    0.001  136.857    2.582 utils.py:395(_parse_lsb_release_command)
      104    0.052    0.000    0.073    0.001 sre_compile.py:276(_optimize_charset)
      108    0.050    0.000    0.050    0.000 {built-in method posix.pipe}
       53    0.050    0.001    0.095    0.002 protocol.py:121(make_conn_attrs)
     1384    0.048    0.000    0.048    0.000 {built-in method _struct.unpack}
      944    0.047    0.000    0.048    0.000 {built-in method builtins.getattr}
      371    0.044    0.000    0.054    0.000 connection.py:409(_handle_server_status)
       53    0.043    0.001    0.586    0.011 cursor.py:515(execute)
       54    0.042    0.001    0.042    0.001 socket.py:139(__init__)
      624    0.042    0.000    0.053    0.000 connection.py:1238(handle_unread_result)
6839/6550    0.039    0.000    0.043    0.000 {built-in method builtins.len}
        1    0.038    0.038    0.039    0.039 {method 'read' of '_io.TextIOWrapper' objects}
      393    0.037    0.000    0.037    0.000 {method 'format' of 'str' objects}
     1890    0.036    0.000    0.054    0.000 sre_parse.py:164(__getitem__)
     2155    0.035    0.000    0.035    0.000 {built-in method _struct.pack}
       53    0.035    0.001    0.090    0.002 __init__.py:293(__init__)
       15    0.034    0.002    0.034    0.002 {built-in method _imp.create_builtin}
       53    0.033    0.001    2.204    0.042 connection.py:298(_open_connection)
       53    0.033    0.001  137.052    2.586 connection.py:114(_add_default_conn_attrs)
       53    0.033    0.001    0.272    0.005 socket.py:731(getaddrinfo)
     2112    0.033    0.000    0.079    0.000 sre_parse.py:254(get)
      418    0.032    0.000    1.963    0.005 network.py:151(send_plain)
      106    0.032    0.000    0.033    0.000 constants.py:649(get_default_collation)
      118    0.031    0.000    0.031    0.000 constants.py:618(get_info)
      733    0.031    0.000    0.032    0.000 utils.py:308(read_lc_int)
      365    0.031    0.000    0.198    0.001 connection.py:425(_handle_ok)
       53    0.030    0.001    0.098    0.002 os.py:616(get_exec_path)
      442    0.030    0.000    0.030    0.000 {method 'recv_into' of '_socket.socket' objects}
      251    0.029    0.000    0.029    0.000 {built-in method __new__ of type object at 0x3cc514}
      690    0.028    0.000    0.067    0.000 <frozen importlib._bootstrap_external>:56(_path_join)
       53    0.027    0.001    0.057    0.001 protocol.py:193(parse_handshake)
       52    0.027    0.001    0.027    0.001 {function socket.close at 0xb649f2b8}
   317/99    0.027    0.000    0.036    0.000 sre_parse.py:174(getwidth)
       53    0.027    0.001    0.834    0.016 network.py:574(open_connection)
      286    0.026    0.000    0.031    0.000 enum.py:376(__setattr__)
       13    0.026    0.002    0.088    0.007 enum.py:654(<listcomp>)
      477    0.026    0.000    0.026    0.000 {method 'endswith' of 'bytes' objects}
     4842    0.025    0.000    0.025    0.000 {method 'append' of 'list' objects}
       50    0.025    0.000  135.204    2.704 Enregistrement_evenements.py:46(commandeSQL)
      214    0.025    0.000    0.049    0.000 enum.py:70(__setitem__)
      690    0.024    0.000    0.033    0.000 <frozen importlib._bootstrap_external>:58(<listcomp>)
     2467    0.023    0.000    0.023    0.000 {method 'startswith' of 'str' objects}
      365    0.023    0.000    0.037    0.000 utils.py:65(int1store)
     1424    0.022    0.000    0.022    0.000 {built-in method posix.fspath}
       53    0.022    0.000  140.218    2.646 __init__.py:186(connect)
     1380    0.022    0.000    0.022    0.000 {built-in method builtins.hasattr}
       54    0.021    0.000    2.415    0.045 subprocess.py:656(__init__)
       53    0.021    0.000    0.212    0.004 protocol.py:81(make_auth)
       53    0.020    0.000    0.048    0.001 authentication.py:102(prepare_password)
       53    0.020    0.000    0.066    0.001 abstracts.py:615(_check_server_version)
       53    0.019    0.000  136.725    2.580 subprocess.py:431(run)
       16    0.019    0.001    0.031    0.002 enum.py:177(<setcomp>)
       53    0.018    0.000    0.181    0.003 connection.py:147(_do_handshake)
       76    0.018    0.000    0.018    0.000 {built-in method time.strftime}
      106    0.017    0.000    0.017    0.000 {method 'close' of '_io.BufferedReader' objects}
      899    0.017    0.000    0.017    0.000 {method 'get' of 'dict' objects}
      209    0.017    0.000    2.559    0.012 connection.py:633(cmd_query)
       68    0.017    0.000    0.230    0.003 <frozen importlib._bootstrap>:882(_find_spec)
       53    0.017    0.000  140.187    2.645 connection.py:63(__init__)
      365    0.017    0.000    0.053    0.000 protocol.py:146(make_command)
       53    0.017    0.000    0.359    0.007 connection.py:226(_auth_switch_request)
       47    0.016    0.000    0.028    0.001 <frozen importlib._bootstrap_external>:914(get_data)
      311    0.016    0.000    0.238    0.001 enum.py:284(__call__)
      212    0.015    0.000    0.036    0.000 socket.py:97(_intenum_converter)
       47    0.014    0.000    0.265    0.006 <frozen importlib._bootstrap_external>:793(get_code)
       86    0.014    0.000    0.637    0.007 re.py:271(_compile)
     69/4    0.014    0.000    1.964    0.491 <frozen importlib._bootstrap>:978(_find_and_load)
       53    0.014    0.000    0.014    0.000 warnings.py:493(__exit__)
      744    0.014    0.000    0.014    0.000 <frozen importlib._bootstrap>:222(_verbose_message)
       61    0.014    0.000    0.017    0.000 conversion.py:233(_str_to_mysql)
   123/34    0.013    0.000    0.342    0.010 sre_parse.py:417(_parse_sub)
       53    0.013    0.000  140.153    2.644 abstracts.py:974(connect)
      107    0.013    0.000    0.173    0.002 subprocess.py:1592(_wait)
       53    0.013    0.000  136.740    2.580 subprocess.py:351(check_output)
       54    0.013    0.000    0.017    0.000 posixpath.py:154(dirname)
       94    0.013    0.000    0.031    0.000 <frozen importlib._bootstrap_external>:271(cache_from_source)
       53    0.013    0.000    0.082    0.002 protocol.py:58(_auth_response)
      159    0.012    0.000    0.012    0.000 {method 'digest' of '_hashlib.HASH' objects}
      133    0.012    0.000    0.012    0.000 {method 'decode' of 'bytearray' objects}
       52    0.012    0.000    0.012    0.000 {method 'shutdown' of '_socket.socket' objects}
       53    0.012    0.000  136.929    2.584 utils.py:419(linux_distribution)
       53    0.012    0.000    0.482    0.009 abstracts.py:888(set_charset_collation)
       53    0.012    0.000    0.567    0.011 connection.py:958(cursor)
      298    0.012    0.000    0.016    0.000 enum.py:526(__new__)
      162    0.012    0.000    0.012    0.000 {built-in method posix.close}
       53    0.012    0.000    0.194    0.004 <frozen importlib._bootstrap_external>:1240(_get_spec)
     66/5    0.012    0.000    1.930    0.386 <frozen importlib._bootstrap>:663(_load_unlocked)
       53    0.012    0.000    0.014    0.000 abstracts.py:71(__init__)
       53    0.012    0.000  134.310    2.534 subprocess.py:895(communicate)
      610    0.011    0.000    0.011    0.000 {built-in method builtins.min}
       53    0.011    0.000    1.054    0.020 connection.py:181(_do_auth)
       53    0.011    0.000    0.012    0.000 os.py:755(decode)
       47    0.011    0.000    0.011    0.000 {method 'read' of '_io.FileIO' objects}
       53    0.011    0.000    0.035    0.001 connection.py:279(_get_connection)
        1    0.011    0.011    0.063    0.063 idna.py:3(<module>)
       53    0.011    0.000    0.011    0.000 abstracts.py:345(unix_socket)
       79    0.011    0.000    0.017    0.000 <frozen importlib._bootstrap>:157(_get_module_lock)
      508    0.011    0.000    0.011    0.000 {method 'split' of 'str' objects}
       66    0.010    0.000    0.048    0.001 <frozen importlib._bootstrap>:504(_init_module_attrs)
      209    0.010    0.000    0.125    0.001 connection.py:511(_handle_result)
     54/1    0.010    0.000 4606.402 4606.402 {built-in method builtins.exec}
        6    0.010    0.002    0.021    0.003 __init__.py:316(namedtuple)
       53    0.010    0.000    0.108    0.002 __init__.py:1123(emit)
      742    0.010    0.000    0.010    0.000 constants.py:90(flag_is_set)
       53    0.010    0.000    0.018    0.000 __init__.py:1451(findCaller)
       52    0.010    0.000    0.029    0.001 network.py:148(__del__)
      526    0.010    0.000    0.012    0.000 sre_parse.py:172(append)
      990    0.009    0.000    0.010    0.000 {method 'join' of 'str' objects}
     1474    0.009    0.000    0.009    0.000 {method 'rstrip' of 'str' objects}
      638    0.009    0.000    0.025    0.000 posixpath.py:41(_get_sep)
        1    0.009    0.009    0.009    0.009 errorcode.py:32(<module>)
      130    0.009    0.000    0.012    0.000 conversion.py:160(quote)
       53    0.009    0.000    0.010    0.000 authentication.py:519(get_auth_plugin)
      727    0.009    0.000    0.015    0.000 sre_parse.py:249(match)
       35    0.009    0.000    0.014    0.000 {method 'sub' of 're.Pattern' objects}
      130    0.009    0.000    0.036    0.000 conversion.py:179(to_mysql)
      340    0.008    0.000    0.027    0.000 {built-in method builtins.setattr}
      422    0.008    0.000    0.011    0.000 sre_parse.py:286(tell)
      598    0.008    0.000    0.011    0.000 sre_parse.py:160(__len__)
      125    0.008    0.000    0.008    0.000 {built-in method now}
      477    0.008    0.000    0.008    0.000 {method 'startswith' of 'bytes' objects}
      106    0.008    0.000    0.012    0.000 abstracts.py:671(set_client_flags)
      106    0.008    0.000    0.029    0.000 os.py:673(__getitem__)
       79    0.008    0.000    0.009    0.000 <frozen importlib._bootstrap>:78(acquire)
       53    0.008    0.000    0.008    0.000 authentication.py:63(__init__)
       13    0.008    0.001    0.205    0.016 enum.py:389(_create_)
       79    0.008    0.000    0.009    0.000 <frozen importlib._bootstrap>:103(release)
       53    0.008    0.000    0.098    0.002 __init__.py:1022(emit)
       53    0.008    0.000    0.064    0.001 abstracts.py:1143(set_converter_class)
      106    0.008    0.000    0.052    0.000 conversion.py:60(set_charset)
      159    0.007    0.000    0.007    0.000 constants.py:464(get_default)
       34    0.007    0.000    0.599    0.018 sre_compile.py:759(compile)
       53    0.007    0.000    0.010    0.000 protocol.py:127(<listcomp>)
      215    0.007    0.000    0.008    0.000 enum.py:26(_is_dunder)
      100    0.007    0.000    0.009    0.000 sre_parse.py:343(_escape)
       53    0.007    0.000    0.254    0.005 __init__.py:1361(debug)
     69/4    0.007    0.000    1.960    0.490 <frozen importlib._bootstrap>:948(_find_and_load_unlocked)
       53    0.007    0.000    0.011    0.000 network.py:564(__init__)
     1531    0.007    0.000    0.007    0.000 {method 'isupper' of 'str' objects}
       52    0.007    0.000    0.019    0.000 network.py:131(shutdown)
      286    0.007    0.000    0.007    0.000 sre_parse.py:111(__init__)
      130    0.007    0.000    0.011    0.000 conversion.py:132(escape)
      442    0.007    0.000    0.007    0.000 {method 'extend' of 'bytearray' objects}
      106    0.007    0.000    0.009    0.000 os.py:751(encode)
      104    0.006    0.000    0.008    0.000 sre_compile.py:249(_compile_charset)
      159    0.006    0.000    0.046    0.000 constants.py:673(get_charset_info)
       53    0.006    0.000    0.312    0.006 abstracts.py:775(autocommit)
      364    0.006    0.000    0.010    0.000 socket.py:81(<lambda>)
      366    0.006    0.000    0.010    0.000 socket.py:91(<lambda>)
      103    0.006    0.000    1.842    0.018 connection.py:1034(_execute_query)
       53    0.006    0.000    0.279    0.005 cursor.py:322(__init__)
       53    0.006    0.000    0.006    0.000 authentication.py:134(<listcomp>)
       66    0.006    0.000    0.013    0.000 <frozen importlib._bootstrap>:318(__exit__)
      365    0.006    0.000    0.011    0.000 socket.py:86(<lambda>)
      320    0.006    0.000    0.006    0.000 {method 'find' of 'bytearray' objects}
      363    0.006    0.000    0.010    0.000 socket.py:76(<lambda>)
       33    0.006    0.000    0.006    0.000 {built-in method _abc._abc_init}
       35    0.006    0.000    0.073    0.002 cursor.py:423(_process_params)
       32    0.006    0.000    0.006    0.000 sre_compile.py:413(<listcomp>)
       53    0.006    0.000    0.123    0.002 __init__.py:1575(callHandlers)
      214    0.006    0.000    0.007    0.000 enum.py:34(_is_sunder)
       53    0.006    0.000    0.050    0.001 utils.py:375(_parse_lsb_release)
      107    0.006    0.000    0.179    0.002 subprocess.py:985(wait)
       34    0.006    0.000    0.056    0.002 sre_compile.py:536(_compile_info)
      160    0.006    0.000    0.006    0.000 {built-in method _hashlib.openssl_sha1}
      624    0.006    0.000    0.006    0.000 abstracts.py:360(can_consume_results)
      103    0.006    0.000    0.006    0.000 cursor.py:351(_reset_result)
      636    0.006    0.000    0.006    0.000 abstracts.py:836(unread_result)
       51    0.006    0.000    0.008    0.000 <frozen importlib._bootstrap_external>:574(spec_from_file_location)
       53    0.006    0.000    0.006    0.000 warnings.py:474(__enter__)
      245    0.005    0.000    0.037    0.000 <frozen importlib._bootstrap_external>:74(_path_stat)
      106    0.005    0.000    0.520    0.005 connection.py:785(cmd_ping)
      130    0.005    0.000    0.005    0.000 cursor.py:79(__call__)
      514    0.005    0.000    0.005    0.000 {method 'rpartition' of 'str' objects}
       53    0.005    0.000    0.008    0.000 warnings.py:181(_add_filter)
       53    0.005    0.000    0.008    0.000 idna.py:147(encode)
      170    0.005    0.000    0.006    0.000 <frozen importlib._bootstrap>:416(parent)
       47    0.005    0.000    0.183    0.004 <frozen importlib._bootstrap_external>:523(_compile_bytecode)
       53    0.005    0.000    0.094    0.002 __init__.py:1481(makeRecord)
     47/5    0.005    0.000    1.923    0.385 <frozen importlib._bootstrap_external>:722(exec_module)
      138    0.005    0.000    0.013    0.000 sre_compile.py:423(_simple)
       53    0.005    0.000    0.021    0.000 posixpath.py:144(basename)
       54    0.005    0.000    0.013    0.000 subprocess.py:1329(_get_handles)
       53    0.005    0.000    0.015    0.000 cursor.py:466(_handle_result)
       53    0.005    0.000    0.005    0.000 abstracts.py:636(<listcomp>)
      103    0.005    0.000    0.134    0.001 connection.py:334(close)
      286    0.005    0.000    0.005    0.000 {method 'get' of 'mappingproxy' objects}
        3    0.005    0.002    0.030    0.010 conversion.py:378(row_to_python)
      106    0.005    0.000    0.007    0.000 utils.py:273(read_string)
       53    0.005    0.000    0.024    0.000 conversion.py:50(__init__)
       53    0.005    0.000    0.246    0.005 __init__.py:1496(_log)
       50    0.005    0.000    0.095    0.002 connection.py:712(cmd_quit)
       53    0.005    0.000    0.021    0.000 __init__.py:606(format)
       50    0.005    0.000    0.009    0.000 cursor.py:441(_handle_noresultset)
    66/65    0.005    0.000    0.205    0.003 <frozen importlib._bootstrap>:576(module_from_spec)
       53    0.005    0.000    0.007    0.000 cursor.py:140(__init__)
        1    0.004    0.004    0.052    0.052 tokenize.py:21(<module>)
       34    0.004    0.000    0.352    0.010 sre_parse.py:919(parse)
       53    0.004    0.000    0.798    0.015 abstracts.py:954(_post_connection)
       53    0.004    0.000    0.066    0.001 __init__.py:1011(flush)
  181/167    0.004    0.000    0.193    0.001 <frozen importlib._bootstrap>:1009(_handle_fromlist)
      138    0.004    0.000    0.006    0.000 {built-in method builtins.any}
      167    0.004    0.000    0.004    0.000 {method 'decode' of 'bytes' objects}
       53    0.004    0.000    0.004    0.000 __init__.py:371(getMessage)
       53    0.004    0.000    0.005    0.000 protocol.py:52(_connect_with_db)
       53    0.004    0.000    0.118    0.002 __init__.py:892(handle)
     23/5    0.004    0.000    0.005    0.001 {built-in method _abc._abc_subclasscheck}
       32    0.004    0.000    0.011    0.000 sre_compile.py:411(_mk_bitmap)
       53    0.004    0.000    0.004    0.000 __init__.py:432(format)
       53    0.004    0.000    0.004    0.000 network.py:99(__init__)
       65    0.004    0.000    0.007    0.000 sre_parse.py:84(opengroup)
      176    0.004    0.000    0.007    0.000 enum.py:18(_is_descriptor)
       53    0.004    0.000    0.005    0.000 genericpath.py:117(_splitext)
       53    0.004    0.000    0.128    0.002 __init__.py:1521(handle)
Titre: Script python lancé en double, pourquoi
Posté par: kgersen le 25 octobre 2020 à 19:35:13
c'est en python2 ou 3 cette trace ? poste les 2 versions eventuellement.
Titre: Script python lancé en double, pourquoi
Posté par: Darkjeje le 25 octobre 2020 à 19:43:04
c'est en python2 ou 3 cette trace ? poste les 2 versions eventuellement.

C'est 1h de Python3.
Par contre je t'ai mis qu'environ 20 000 caractères sur les 61 000 que m'a sorti la commande.

Je lance Python2 et je posterai le retour dans une heure.
Merci kgersen
Titre: Script python lancé en double, pourquoi
Posté par: kgersen le 25 octobre 2020 à 19:51:05
trop long 1 heure, on ne voit trop rien.

je parlais de tracer/profiler cela:

Comme certain semble l'avoir constaté sur d'autre forum, Python 3.x est beaucoup plus lent que Python 2.x.
Pour mon relevé de consommation horaire, soit 25 valeurs, j'obtiens les temps suivants :
Python 3.7 : 67,05 secondes
Python 2.7 : 4,17 secondes.

Ce poste en parle https://webdevdesigner.com/q/why-is-python-3-is-considerably-slower-than-python-2-duplicate-72236/ (https://webdevdesigner.com/q/why-is-python-3-is-considerably-slower-than-python-2-duplicate-72236/), mais je ne vois pas ce que je peux faire pour corriger cela avec Python 3.x

Vous auriez une idée, mis à part repasser sur Python 2.7 ?

si tu poste la trace des 67 secondes en python3 et celle des 4,17 secondes en python2 on verra ou est le problème.
Titre: Script python lancé en double, pourquoi
Posté par: Darkjeje le 25 octobre 2020 à 21:15:14
trop long 1 heure, on ne voit trop rien.

je parlais de tracer/profiler cela:

si tu poste la trace des 67 secondes en python3 et celle des 4,17 secondes en python2 on verra ou est le problème.

Toutes mes excuses, je n'avais pas compris.
Voici le retour de python2.7
         32480 function calls (31507 primitive calls) in 5.790 seconds

   Ordered by: internal time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
       45    3.716    0.083    3.716    0.083 {method 'recv' of '_socket.socket' objects}
        1    0.211    0.211    5.791    5.791 Enregistrement_evenements.py:3(<module>)
   151/40    0.133    0.001    0.382    0.010 sre_parse.py:414(_parse)
       22    0.107    0.005    0.107    0.005 {method 'sendall' of '_socket.socket' objects}
   317/36    0.089    0.000    0.203    0.006 sre_compile.py:64(_compile)
     2183    0.084    0.000    0.100    0.000 sre_parse.py:194(__next)
        2    0.074    0.037    0.074    0.037 {method 'read' of 'file' objects}
        1    0.065    0.065    0.069    0.069 socket.py:45(<module>)
        3    0.054    0.018    0.064    0.021 collections.py:305(namedtuple)
  462/192    0.039    0.000    0.046    0.000 sre_parse.py:152(getwidth)
     1428    0.038    0.000    0.064    0.000 sre_parse.py:142(__getitem__)
     1869    0.037    0.000    0.122    0.000 sre_parse.py:213(get)
        1    0.036    0.036    1.220    1.220 connection.py:30(<module>)
        2    0.032    0.016    0.044    0.022 __init__.py:1(<module>)
6836/6655    0.030    0.000    0.033    0.000 {len}
        3    0.030    0.010    0.030    0.010 {_socket.getaddrinfo}
     1759    0.027    0.000    0.029    0.000 {isinstance}
        1    0.026    0.026    0.034    0.034 __init__.py:30(<module>)
        4    0.026    0.006    0.026    0.006 {method 'connect' of '_socket.socket' objects}
   139/36    0.024    0.000    0.387    0.011 sre_parse.py:336(_parse_sub)
        1    0.023    0.023    0.052    0.052 __init__.py:24(<module>)
      116    0.022    0.000    0.039    0.000 sre_compile.py:256(_optimize_charset)
        1    0.021    0.021    0.021    0.021 hashlib.py:56(<module>)
     4213    0.020    0.000    0.020    0.000 {method 'append' of 'list' objects}
      125    0.020    0.000    0.020    0.000 {built-in method now}
        1    0.019    0.019    0.019    0.019 {posix.read}
        1    0.017    0.017    0.236    0.236 catch23.py:29(<module>)
        1    0.017    0.017    1.282    1.282 __init__.py:31(<module>)
        1    0.016    0.016    0.496    0.496 authentication.py:29(<module>)
      154    0.015    0.000    0.686    0.004 re.py:230(_compile)
      987    0.014    0.000    0.027    0.000 sre_parse.py:207(match)
        1    0.013    0.013    0.218    0.218 decimal.py:116(<module>)
        1    0.013    0.013    0.013    0.013 {function seed at 0xb66d3630}
        3    0.013    0.004    0.015    0.005 protocol.py:121(make_conn_attrs)
        1    0.013    0.013    0.074    0.074 constants.py:30(<module>)
       22    0.012    0.001    0.013    0.001 network.py:74(_prepare_packets)
       22    0.012    0.001    0.042    0.002 abc.py:86(__new__)
       27    0.012    0.000    0.012    0.000 {method 'extend' of 'bytearray' objects}
       39    0.011    0.000    0.011    0.000 {built-in method __new__ of type object at 0x29fc30}
        1    0.011    0.011    0.291    0.291 errors.py:30(<module>)
      746    0.011    0.000    0.011    0.000 {getattr}
        1    0.011    0.011    0.038    0.038 subprocess.py:31(<module>)
        2    0.011    0.005    0.011    0.005 decimal.py:1638(_fix)
      684    0.010    0.000    0.013    0.000 sre_parse.py:138(__len__)
      116    0.010    0.000    0.051    0.000 sre_compile.py:228(_compile_charset)
       23    0.010    0.000    0.010    0.000 {_codecs.utf_8_decode}
        6    0.010    0.002    0.010    0.002 {method 'settimeout' of '_socket.socket' objects}
        2    0.010    0.005    0.012    0.006 {__import__}
        1    0.010    0.010    0.049    0.049 util.py:1(<module>)
      599    0.010    0.000    0.013    0.000 sre_parse.py:150(append)
      156    0.009    0.000    0.021    0.000 sre_compile.py:428(_simple)
        1    0.009    0.009    0.273    0.273 cursor.py:30(<module>)
       22    0.009    0.000    0.131    0.006 network.py:151(send_plain)
       27    0.009    0.000    0.046    0.002 network.py:258(recv_plain)
        1    0.008    0.008    0.027    0.027 pickle.py:25(<module>)
       36    0.008    0.000    0.056    0.002 sre_compile.py:433(_compile_info)
        1    0.008    0.008    0.008    0.008 errorcode.py:32(<module>)
        1    0.007    0.007    0.172    0.172 uuid.py:45(<module>)
        1    0.007    0.007    0.010    0.010 hmac.py:4(<module>)
        1    0.007    0.007    0.011    0.011 collections.py:11(<module>)
        1    0.007    0.007    0.019    0.019 io.py:34(<module>)
        1    0.007    0.007    0.071    0.071 optionfiles.py:30(<module>)
        1    0.007    0.007    0.044    0.044 random.py:40(<module>)
        1    0.007    0.007    0.245    0.245 utils.py:30(<module>)
      645    0.007    0.000    0.007    0.000 {min}
       28    0.007    0.000    0.008    0.000 sre_compile.py:411(_mk_bitmap)
       26    0.006    0.000    0.006    0.000 {time.strftime}
        1    0.006    0.006    0.059    0.059 ssl.py:89(<module>)
        5    0.006    0.001    0.012    0.002 ssl.py:115(_import_symbols)
      112    0.006    0.000    0.008    0.000 sre_parse.py:278(_escape)
    20/15    0.006    0.000    0.014    0.001 abc.py:148(__subclasscheck__)
       36    0.006    0.000    0.669    0.019 sre_compile.py:567(compile)
       36    0.006    0.000    0.398    0.011 sre_parse.py:725(parse)
       87    0.005    0.000    0.012    0.000 abc.py:89(<genexpr>)
        1    0.005    0.005    0.064    0.064 ConfigParser.py:88(<module>)
      618    0.005    0.000    0.005    0.000 {ord}
      336    0.005    0.000    0.005    0.000 {method 'find' of 'bytearray' objects}
      768    0.005    0.000    0.005    0.000 {chr}
        3    0.005    0.002    0.030    0.010 protocol.py:81(make_auth)
      595    0.005    0.000    0.005    0.000 {method 'startswith' of 'str' objects}
        1    0.005    0.005    0.016    0.016 threading.py:1(<module>)
      317    0.005    0.000    0.005    0.000 sre_parse.py:93(__init__)
       81    0.004    0.000    0.004    0.000 _weakrefset.py:36(__init__)
      117    0.004    0.000    0.017    0.000 re.py:138(match)
        1    0.004    0.004    0.083    0.083 abstracts.py:29(<module>)
        1    0.004    0.004    0.006    0.006 base64.py:3(<module>)
        1    0.004    0.004    0.004    0.004 heapq.py:31(<module>)
       19    0.003    0.000    0.009    0.000 protocol.py:241(parse_ok)
        3    0.003    0.001    0.006    0.002 utils.py:354(_parse_os_release)
        3    0.003    0.001    0.081    0.027 abstracts.py:365(config)
       51    0.003    0.000    0.006    0.000 catch23.py:88(struct_unpack)
       78    0.003    0.000    0.003    0.000 {_struct.unpack_from}
        1    0.003    0.003    0.003    0.003 {method 'search' of '_sre.SRE_Pattern' objects}
        7    0.003    0.000    0.003    0.000 {dir}
        1    0.003    0.003    0.003    0.003 network.py:30(<module>)
      140    0.003    0.000    0.003    0.000 {method 'split' of 'unicode' objects}
      124    0.003    0.000    0.003    0.000 {method 'match' of '_sre.SRE_Pattern' objects}
        1    0.003    0.003    0.003    0.003 {posix.popen}
        1    0.003    0.003    0.003    0.003 {method 'shutdown' of '_socket.socket' objects}
      174    0.003    0.000    0.003    0.000 collections.py:349(<genexpr>)
       17    0.003    0.000    0.139    0.008 connection.py:347(_send_cmd)
       36    0.003    0.000    0.661    0.018 re.py:192(compile)
       36    0.003    0.000    0.262    0.007 sre_compile.py:552(_code)
       78    0.003    0.000    0.003    0.000 sre_parse.py:75(opengroup)
       23    0.002    0.000    0.004    0.000 sre_parse.py:228(isname)
        3    0.002    0.001    0.018    0.006 protocol.py:193(parse_handshake)
        1    0.002    0.002    0.024    0.024 subprocess.py:900(_execute_child)
        1    0.002    0.002    0.002    0.002 conversion.py:114(MySQLConverter)
        3    0.002    0.001    0.002    0.001 __init__.py:75(CFUNCTYPE)
        1    0.002    0.002    0.002    0.002 stringprep.py:6(<module>)
        1    0.002    0.002    0.002    0.002 {posix.fork}
        3    0.002    0.001    0.007    0.002 authentication.py:102(prepare_password)
       14    0.002    0.000    0.003    0.000 __init__.py:144(_check_size)
       37    0.002    0.000    0.005    0.000 _weakrefset.py:58(__iter__)
       73    0.002    0.000    0.002    0.000 {method 'format' of 'str' objects}
        1    0.002    0.002    0.004    0.004 conversion.py:30(<module>)
      172    0.002    0.000    0.002    0.000 {_sre.getlower}
      117    0.002    0.000    0.002    0.000 {_struct.pack}
       51    0.002    0.000    0.003    0.000 {method 'encode' of 'str' objects}

Et voici celui de Python 3.7 :
         54084 function calls (52722 primitive calls) in 12.564 seconds

   Ordered by: internal time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        3    6.038    2.013    6.038    2.013 {method 'read' of '_io.BufferedReader' objects}
       38    3.964    0.104    3.964    0.104 {method 'recv' of '_socket.socket' objects}
       47    0.180    0.004    0.180    0.004 {built-in method marshal.loads}
   137/38    0.119    0.001    0.329    0.009 sre_parse.py:475(_parse)
        4    0.112    0.028    0.112    0.028 {built-in method posix.read}
        4    0.089    0.022    0.115    0.029 {built-in method _imp.create_dynamic}
       63    0.082    0.001    0.082    0.001 {built-in method builtins.print}
       14    0.068    0.005    0.068    0.005 {method 'sendall' of '_socket.socket' objects}
       16    0.065    0.004    0.165    0.010 enum.py:135(__new__)
   262/34    0.057    0.000    0.161    0.005 sre_compile.py:71(_compile)
      104    0.055    0.001    0.075    0.001 sre_compile.py:276(_optimize_charset)
      131    0.054    0.000    0.168    0.001 <frozen importlib._bootstrap_external>:1356(find_spec)
      152    0.051    0.000    0.260    0.002 {built-in method builtins.__build_class__}
     2454    0.049    0.000    0.049    0.000 sre_parse.py:233(__next)
        1    0.042    0.042    0.042    0.042 {method 'read' of '_io.TextIOWrapper' objects}
     1890    0.037    0.000    0.055    0.000 sre_parse.py:164(__getitem__)
     5304    0.037    0.000    0.040    0.000 {built-in method builtins.isinstance}
       15    0.034    0.002    0.034    0.002 {built-in method _imp.create_builtin}
      248    0.034    0.000    0.034    0.000 {built-in method posix.stat}
     2112    0.029    0.000    0.070    0.000 sre_parse.py:254(get)
        3    0.029    0.010    0.029    0.010 {method 'connect' of '_socket.socket' objects}
      251    0.028    0.000    0.028    0.000 {built-in method __new__ of type object at 0x3cc514}
        4    0.027    0.007    0.183    0.046 subprocess.py:1383(_execute_child)
      690    0.027    0.000    0.065    0.000 <frozen importlib._bootstrap_external>:56(_path_join)
   317/99    0.027    0.000    0.036    0.000 sre_parse.py:174(getwidth)
      286    0.026    0.000    0.031    0.000 enum.py:376(__setattr__)
        1    0.026    0.026   12.564   12.564 Enregistrement_evenements.py:3(<module>)
      214    0.025    0.000    0.051    0.000 enum.py:70(__setitem__)
      690    0.024    0.000    0.032    0.000 <frozen importlib._bootstrap_external>:58(<listcomp>)
       13    0.023    0.002    0.077    0.006 enum.py:654(<listcomp>)
      712    0.023    0.000    0.025    0.000 {built-in method builtins.getattr}
3728/3439    0.021    0.000    0.025    0.000 {built-in method builtins.len}
     4323    0.021    0.000    0.021    0.000 {method 'append' of 'list' objects}
        4    0.020    0.005    0.020    0.005 {built-in method _posixsubprocess.fork_exec}
       16    0.018    0.001    0.030    0.002 enum.py:177(<setcomp>)
     2217    0.018    0.000    0.018    0.000 {method 'startswith' of 'str' objects}
        2    0.017    0.009    0.091    0.046 {built-in method _socket.getaddrinfo}
       68    0.017    0.000    0.226    0.003 <frozen importlib._bootstrap>:882(_find_spec)
       47    0.017    0.000    0.027    0.001 <frozen importlib._bootstrap_external>:914(get_data)
     1175    0.015    0.000    0.015    0.000 {built-in method builtins.hasattr}
       47    0.015    0.000    0.271    0.006 <frozen importlib._bootstrap_external>:793(get_code)
     69/4    0.014    0.000    1.914    0.478 <frozen importlib._bootstrap>:978(_find_and_load)
       94    0.014    0.000    0.033    0.000 <frozen importlib._bootstrap_external>:271(cache_from_source)
   123/34    0.014    0.000    0.335    0.010 sre_parse.py:417(_parse_sub)
        3    0.012    0.004    0.012    0.004 {built-in method time.sleep}
     66/5    0.012    0.000    1.881    0.376 <frozen importlib._bootstrap>:663(_load_unlocked)
      744    0.012    0.000    0.012    0.000 <frozen importlib._bootstrap>:222(_verbose_message)
        2    0.012    0.006    0.013    0.006 protocol.py:121(make_conn_attrs)
       53    0.012    0.000    0.189    0.004 <frozen importlib._bootstrap_external>:1240(_get_spec)
       35    0.011    0.000    0.599    0.017 re.py:271(_compile)
        3    0.011    0.004    0.011    0.004 warnings.py:474(__enter__)
       47    0.011    0.000    0.011    0.000 {method 'read' of '_io.FileIO' objects}
       79    0.010    0.000    0.017    0.000 <frozen importlib._bootstrap>:157(_get_module_lock)
        2    0.010    0.005    0.010    0.005 cursor.py:363(_have_unread_result)
       66    0.010    0.000    0.054    0.001 <frozen importlib._bootstrap>:504(_init_module_attrs)
      100    0.010    0.000    0.010    0.000 {built-in method now}
     54/1    0.010    0.000   12.564   12.564 {built-in method builtins.exec}
      562    0.010    0.000    0.010    0.000 {built-in method builtins.min}
        6    0.009    0.002    0.020    0.003 __init__.py:316(namedtuple)
        1    0.009    0.009    0.009    0.009 errorcode.py:32(<module>)
      526    0.009    0.000    0.012    0.000 sre_parse.py:172(append)
      888    0.008    0.000    0.009    0.000 {method 'join' of 'str' objects}
      727    0.008    0.000    0.014    0.000 sre_parse.py:249(match)
        2    0.008    0.004    0.008    0.004 {method 'write' of '_io.TextIOWrapper' objects}
     1474    0.008    0.000    0.008    0.000 {method 'rstrip' of 'str' objects}
       34    0.008    0.000    0.574    0.017 sre_compile.py:759(compile)
      422    0.008    0.000    0.009    0.000 sre_parse.py:286(tell)
       13    0.007    0.001    0.207    0.016 enum.py:389(_create_)
       79    0.007    0.000    0.008    0.000 <frozen importlib._bootstrap>:78(acquire)
      598    0.007    0.000    0.010    0.000 sre_parse.py:160(__len__)
      215    0.007    0.000    0.008    0.000 enum.py:26(_is_dunder)
       79    0.007    0.000    0.008    0.000 <frozen importlib._bootstrap>:103(release)
     69/4    0.007    0.000    1.910    0.478 <frozen importlib._bootstrap>:948(_find_and_load_unlocked)
        1    0.007    0.007    0.007    0.007 {built-in method posix.uname}
      240    0.006    0.000    0.026    0.000 {built-in method builtins.setattr}
      286    0.006    0.000    0.006    0.000 sre_parse.py:111(__init__)
      104    0.006    0.000    0.008    0.000 sre_compile.py:249(_compile_charset)
      363    0.006    0.000    0.010    0.000 socket.py:76(<lambda>)
       66    0.006    0.000    0.011    0.000 <frozen importlib._bootstrap>:318(__exit__)
     1531    0.006    0.000    0.006    0.000 {method 'isupper' of 'str' objects}
       32    0.006    0.000    0.006    0.000 sre_compile.py:413(<listcomp>)
       51    0.006    0.000    0.008    0.000 <frozen importlib._bootstrap_external>:574(spec_from_file_location)
       33    0.006    0.000    0.006    0.000 {built-in method _abc._abc_init}
      320    0.006    0.000    0.006    0.000 {method 'find' of 'bytearray' objects}
       19    0.006    0.000    0.017    0.001 network.py:258(recv_plain)
      214    0.006    0.000    0.009    0.000 enum.py:34(_is_sunder)
      100    0.005    0.000    0.007    0.000 sre_parse.py:343(_escape)
     47/5    0.005    0.000    1.867    0.373 <frozen importlib._bootstrap_external>:722(exec_module)
      514    0.005    0.000    0.005    0.000 {method 'rpartition' of 'str' objects}
       34    0.005    0.000    0.054    0.002 sre_compile.py:536(_compile_info)
      245    0.005    0.000    0.038    0.000 <frozen importlib._bootstrap_external>:74(_path_stat)
      364    0.005    0.000    0.009    0.000 socket.py:81(<lambda>)
       47    0.005    0.000    0.188    0.004 <frozen importlib._bootstrap_external>:523(_compile_bytecode)
      365    0.005    0.000    0.009    0.000 socket.py:86(<lambda>)
      286    0.005    0.000    0.005    0.000 {method 'get' of 'mappingproxy' objects}
      366    0.005    0.000    0.009    0.000 socket.py:91(<lambda>)
      107    0.005    0.000    0.220    0.002 enum.py:284(__call__)
    66/65    0.005    0.000    0.212    0.003 <frozen importlib._bootstrap>:576(module_from_spec)
        1    0.005    0.005    0.051    0.051 tokenize.py:21(<module>)
      138    0.005    0.000    0.012    0.000 sre_compile.py:423(_simple)
       34    0.005    0.000    0.346    0.010 sre_parse.py:919(parse)
      176    0.004    0.000    0.007    0.000 enum.py:18(_is_descriptor)
       34    0.004    0.000    0.010    0.000 enum.py:836(__and__)
      136    0.004    0.000    0.004    0.000 {method 'split' of 'str' objects}
       47    0.004    0.000    0.006    0.000 <frozen importlib._bootstrap_external>:438(_classify_pyc)
       69    0.004    0.000    0.006    0.000 <frozen importlib._bootstrap>:58(__init__)
        8    0.004    0.000    0.004    0.001 {built-in method io.open}
       32    0.004    0.000    0.011    0.000 sre_compile.py:411(_mk_bitmap)
      443    0.004    0.000    0.004    0.000 {method 'get' of 'dict' objects}
       69    0.004    0.000    0.005    0.000 <frozen importlib._bootstrap>:176(cb)
       45    0.004    0.000    0.005    0.000 enum.py:453(_find_data_type)
       51    0.004    0.000    0.022    0.000 <frozen importlib._bootstrap_external>:369(_get_cached)
      120    0.004    0.000    0.005    0.000 <frozen importlib._bootstrap>:416(parent)
       13    0.003    0.000    0.296    0.023 enum.py:633(_convert)
      163    0.003    0.000    0.007    0.000 <frozen importlib._bootstrap_external>:1203(_path_importer_cache)
       65    0.003    0.000    0.006    0.000 sre_parse.py:84(opengroup)
Petite précision, les temps indiqués sont très légèrement supérieur sur Python 3.7 car j'ai arrêté le script avec 1 à 2 secondes de retard par rapport à Python2.7.
Titre: Script python lancé en double, pourquoi
Posté par: kgersen le 25 octobre 2020 à 21:25:55
et le script ?  c'est le meme que deja posté ?
Titre: Script python lancé en double, pourquoi
Posté par: Darkjeje le 25 octobre 2020 à 21:48:06
et le script ?  c'est le meme que deja posté ?

Non en effet, voici le nouveau :
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from datetime import date, timedelta, datetime
import re, time, socket, mysql.connector, os, logging, decimal

# initialize the log settings
logging.basicConfig(filename='/home/pi/Script_Cron_Domotique/log_Enregistrement_evenements.log',level=logging.DEBUG)

AllLumiere='0#'
Allume='1'
Eteindre='0'
LumiereBureau='22'
LumiereChambre='81'
LumiereCuisinePlafonnier='15'
LumiereCuisinePlanDeTravail='16'
LumiereCouloir='11'
LumiereWC='31'
LumiereSalleDeBainPlafonnier='33'
LumiereSalleDeBainMiroir='24'
LumiereSalon='17'

FenetreTiming='*2*1000#'
AllVolet='*5##'
Stop='0'
Ouverture='1'
Fermeture='2'
VoletBureau='52'
VoletChambre='51'
VoletSalon='57'
VoletBalcon='58'

TemperatureSalon='1'
TemperatureChambre='2'
TemperatureBureau='3'

Date = time.strftime('%Y-%m-%d %H:%M:%S')
Timestamp = time.time()

#Paramètres de la connexion à la base de données Mysql
config = {
    'user': 'XXXXXXXX',
    'password': 'XXXXXXXX',
    'host': 'localhost',
    'database': 'domotique',}

def commandeSQL(commande, valeurs=None):
  conn = mysql.connector.connect(**config)
  cursor = conn.cursor()
  cursor.execute(commande, valeurs)
  conn.commit()
  cursor.close()
  conn.close()

def lectureSQL(lecture):
  conn = mysql.connector.connect(**config)
  cursor = conn.cursor()
  cursor.execute(lecture)
  conn.commit()
  cursor.close()
  conn.close()

#Paramètres de connexion à la passerelle BUS/SCS
buffer_size = 2048
ip_F455 = 'XXX.XXX.XXX.XXX'
port_F455 = XXXXX

#Ouverture du socket
try:
    s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((ip_F455,port_F455))
    DataDecode=s.recv(buffer_size).decode('UTF-8')
    print (Date + " : " + DataDecode + " = Retour de connexion")

    s.send(b"*99*1##")#Ouverture d'une session COMMAND
    DataDecode=s.recv(buffer_size).decode('UTF-8')
    print (Date + " : " + DataDecode + " = Retour d'ouverture de commande")
    while True:
        DataDecode=s.recv(buffer_size).decode('UTF-8')
        for DataDecode in DataDecode.split("##"):
            if DataDecode!='':
                Date = time.strftime('%Y-%m-%d %H:%M:%S')
                Timestamp = time.time()
                print ("Webserveur :" + DataDecode)
                   
# Enregistrement des lumières ---------------------------------------------------------------------------------------------------------
                if DataDecode[0:3] == "*1*":
                    if DataDecode[5:7]==AllLumiere: # Toutes les lumières
                        if DataDecode[3:4]==Allume:
                            loggit = "UPDATE lumiere SET etat = 'ON' "
                            commandeSQL(loggit)
                        elif DataDecode[3:4]==Eteindre:
                            loggit = "UPDATE lumiere SET etat = 'OFF' "
                            commandeSQL(loggit)
                           
                    elif DataDecode[5:7]==LumiereBureau: # Bureau
                        if DataDecode[3:4]==Allume:
                            loggit = "UPDATE lumiere SET etat = 'ON' WHERE id_lumiere = '%s' "
                            commandeSQL(loggit %(LumiereBureau))
                            print (Date + " : " + DataDecode + " = Allume lumiere bureau")
                        elif DataDecode[3:4]==Eteindre:                     
                            loggit = "UPDATE lumiere SET etat = 'OFF' WHERE id_lumiere = '%s' "
                            commandeSQL(loggit %(LumiereBureau))
                            print (Date + " : " + DataDecode + " = Eteindre lumiere bureau")
                           
                    elif DataDecode[5:7]==LumiereChambre: # Chambre
                        if DataDecode[3:4]==Allume:
                            loggit = "UPDATE lumiere SET etat = 'ON' WHERE id_lumiere = '%s' "
                            commandeSQL(loggit %(LumiereChambre))
                        elif DataDecode[3:4]==Eteindre:
                            loggit = "UPDATE lumiere SET etat = 'OFF' WHERE id_lumiere = '%s' "
                            commandeSQL(loggit %(LumiereChambre))
                           
                    elif DataDecode[5:7]==LumiereCuisinePlafonnier: # Cuisine plafonnier
                        if DataDecode[3:4]==Allume:
                            loggit = "UPDATE lumiere SET etat = 'ON' WHERE id_lumiere = '%s' "
                            commandeSQL(loggit %(LumiereCuisinePlafonnier))
                        elif DataDecode[3:4]==Eteindre:
                            loggit = "UPDATE lumiere SET etat = 'OFF' WHERE id_lumiere = '%s' "
                            commandeSQL(loggit %(LumiereCuisinePlafonnier))
                           
                    elif DataDecode[5:7]==LumiereCuisinePlanDeTravail: # Cuisine Plan de travail
                        if DataDecode[3:4]==Allume:
                            loggit = "UPDATE lumiere SET etat = 'ON' WHERE id_lumiere = '%s' "
                            commandeSQL(loggit %(LumiereCuisinePlanDeTravail))
                        elif DataDecode[3:4]==Eteindre:
                            loggit = "UPDATE lumiere SET etat = 'OFF' WHERE id_lumiere = '%s' "
                            commandeSQL(loggit %(LumiereCuisinePlanDeTravail))

                    elif DataDecode[5:7]==LumiereCouloir: # Couloir
                        if DataDecode[3:4]==Allume:
                            loggit = "UPDATE lumiere SET etat = 'ON' WHERE id_lumiere = '%s' "
                            commandeSQL(loggit %(LumiereCouloir))
                        elif DataDecode[3:4]==Eteindre:
                            loggit = "UPDATE lumiere SET etat = 'OFF' WHERE id_lumiere = '%s' "
                            commandeSQL(loggit %(LumiereCouloir))
                           
                    elif DataDecode[5:7]==LumiereWC: # WC
                        if DataDecode[3:4]==Allume:
                            loggit = "UPDATE lumiere SET etat = 'ON' WHERE id_lumiere = '%s' "
                            commandeSQL(loggit %(LumiereWC))
                        elif DataDecode[3:4]==Eteindre:
                            loggit = "UPDATE lumiere SET etat = 'OFF' WHERE id_lumiere = '%s' "
                            commandeSQL(loggit %(LumiereWC))

                    elif DataDecode[5:7]==LumiereSalleDeBainPlafonnier: # Salle de Bain Plafonnier
                        if DataDecode[3:4]==Allume:
                            loggit = "UPDATE lumiere SET etat = 'ON' WHERE id_lumiere = '%s' "
                            commandeSQL(loggit %(LumiereSalleDeBainPlafonnier))
                        elif DataDecode[3:4]==Eteindre:
                            loggit = "UPDATE lumiere SET etat = 'OFF' WHERE id_lumiere = '%s' "
                            commandeSQL(loggit %(LumiereSalleDeBainPlafonnier))

                    elif DataDecode[5:7]==LumiereSalleDeBainMiroir: # Salle de Bain Miroir
                        if DataDecode[3:4]==Allume:
                            loggit = "UPDATE lumiere SET etat = 'ON' WHERE id_lumiere = '%s' "
                            commandeSQL(loggit %(LumiereSalleDeBainMiroir))
                        elif DataDecode[3:4]==Eteindre:
                            loggit = "UPDATE lumiere SET etat = 'OFF' WHERE id_lumiere = '%s' "
                            commandeSQL(loggit %(LumiereSalleDeBainMiroir))
                           
                    elif DataDecode[5:7]==LumiereSalon: # Salon
                        if DataDecode[3:4]==Allume:
                            loggit = "UPDATE lumiere SET etat = 'ON' WHERE id_lumiere = '%s' "
                            commandeSQL(loggit %(LumiereSalon))
                        elif DataDecode[3:4]==Eteindre:
                            loggit = "UPDATE lumiere SET etat = 'OFF' WHERE id_lumiere = '%s' "
                            commandeSQL(loggit %(LumiereSalon))
             
                    else:
                        print (Date + " : " + DataDecode + " = Commande Lumiere non prise en compte")
                        loggit = "INSERT INTO commande_inconnue (date_releve, commande) VALUES (%s, %s)"
                        commandeSQL(loggit, (Date, DataDecode))

# Enregistrement des volets ------------------------------------------------------------------------------------------------------------         
                elif DataDecode[0:3] == "*2*":
# Enregistrement des températures ----------------------------------------------------------------------------------------------------
                elif DataDecode[0:4] == "*#4*":
# Enregistrement des consommations par heures -------------------------------------------------------------------------------------
                elif DataDecode[0:12] == "*#18*51*511#":
                    if datetime.now().hour == 0:
                        yesterday = datetime.now() - timedelta(1)
                        Annee = yesterday.year
                        Mois = yesterday.month
                        Jour = yesterday.day
                        Heure = 0
                    else:
                        Annee = datetime.now().year
                        Mois = datetime.now().month
                        Jour = datetime.now().day
                        Heure = datetime.now().hour
                   
                    DataMois = DataDecode.split("#")[2].split("*")
                    DataConso = DataDecode[2:-1].split("#")[2].split("*")
                   
                    heure = int(DataConso[1])
                    conso = int(DataDecode.split("*")[5])
                    jour = int(DataConso[0])
                    mois = int(DataMois[0])
                   
                    data = {}
                    data[heure] = conso

                    if mois == Mois and jour == Jour and Heure == 0: #Si il est minuit passé alors on enregistre la conso d'hier à minuit et le cumul journée
                        print ("Il est minuit")
                        if heure > 23:           
                            loggit = "INSERT INTO consommation (date_releve, timemysql, heure, watt_heure) VALUES (%s, %s, %s, %s)"
                            commandeSQL(loggit, (Date, Timestamp, heure, conso))
                            print ("24 et 25")

                            if heure == 24:
                                print (Date + " : " + DataDecode + " = Heure = 24")
                                #Connexion à la Bdd mysql
                                conn = mysql.connector.connect(**config)
                                cursor = conn.cursor()
                                #Dernier relevé de compteur enregistré
                                query = "SELECT kWh FROM kWh_compteur_EDF"
                                cursor.execute(query)
                               
                                for (kWh) in cursor:
                                    LastkWh = kWh[0]
                                NewkWh = decimal.Decimal(conso) / decimal.Decimal(1000) + LastkWh
                                #Connexion à la Bdd mysql pour saisir le nouveau compteur EDF et sa date d'enregistrement
                                conn = mysql.connector.connect(**config)
                                cursor = conn.cursor()
                                loggit = "UPDATE kWh_compteur_EDF SET kWh = '%s', date_releve = '%s' "
                                cursor.execute(loggit%(NewkWh, Date))
                                conn.commit()
                                cursor.close()
                                conn.close()
                       
                    elif mois == Mois and jour == Jour and Heure != 0: #sinon on regarde la conso de l'heure écoulée
                        print (Date + " : " + DataDecode + "  Heure != 0")
                        if heure == Heure:
                            print (Date + " : " + DataDecode + " Heure = heure")
                            loggit = "INSERT INTO consommation (date_releve, timemysql, heure, watt_heure) VALUES (%s, %s, %s, %s)"
                            commandeSQL(loggit, (Date, Timestamp, heure, conso))
                           
                            #Connexion à la Bdd mysql
                            conn = mysql.connector.connect(**config)
                            cursor = conn.cursor()
                            #Dernier relevé de compteur enregistré
                            query = "SELECT kWh FROM kWh_compteur_EDF"
                            cursor.execute(query)
                           
                            for (kWh) in cursor:
                                LastkWh = kWh[0]
                            NewkWh = decimal.Decimal(conso) / decimal.Decimal(1000) + LastkWh
                            #Connexion à la Bdd mysql pour saisir le nouveau compteur EDF et sa date d'enregistrement
                            conn = mysql.connector.connect(**config)
                            cursor = conn.cursor()
                            loggit = "UPDATE kWh_compteur_EDF SET kWh = '%s', date_releve = '%s' "
                            cursor.execute(loggit%(NewkWh, Date))
                            conn.commit()
                            cursor.close()
                            conn.close()

# Consommations de la prise de courant ??? par heure sur le canal 52 --------------------------------------------------------------
                elif DataDecode[0:12] == "*#18*52*511#":
# Consommations de l'eau chaude par heure sur le canal 53 -------------------------------------------------------------------------
                elif DataDecode[0:11] == "*#18*53*56#":
# Consommations de l'eau froide par heure sur le canal 54 --------------------------------------------------------------------------
                elif DataDecode[0:11] == "*#18*54*56#":
# Consommations du chauffage par heure sur le canal 55 ----------------------------------------------------------------------------
                elif DataDecode[0:11] == "*#18*55*56#":
# Enregistrement de la consommation instantannée ----------------------------------------------------------------------------------
                elif DataDecode[0:12] == "*#18*51*113*":
# Lancement du changement d'heure quand un autre programme change l'heure du webserveur --------------------------------
                elif DataDecode[0:9] == "*#13**#0*":
# Interception d'une demande d'affichage d'heure ------------------------------------------------------------------------------------
                elif DataDecode[0:8] == "*#13**0*":
# Interception d'une demande d'affichage de la date ---------------------------------------------------------------------------------
                elif DataDecode[0:8] == "*#13**1*":
# Interception d'une demande d'affichage de la MAC du webserveur ----------------------------------------------------------------
                elif DataDecode[0:9] == "*#13**12*":
# Interception d'une demande d'affichage du modèle du webserveur ---------------------------------------------------------------
                elif DataDecode[0:9] == "*#13**15*":
# Interception d'une demande d'affichage du firmware du webserveur -------------------------------------------------------------
                elif DataDecode[0:9] == "*#13**16*":
# Interception d'une demande d'affichage de la version du hardware du webserveur ----------------------------------------------
                elif DataDecode[0:9] == "*#13**17*":
# Interception d'une demande de changement de date et heure --------------------------------------------------------------------
                elif DataDecode[0:10] == "*#13**#22*":
# Enregistrement des changements de date et heure --------------------------------------------------------------------------------
                elif DataDecode[0:9] == "*#13**22*":
# Interception d'une demande non documentée --------------------------------------------------------------------------------------
                elif DataDecode[0:10] == "*#13**#27*":
# Enregistrement des autres commandes ---------------------------------------------------------------------------------------------
                else:
    s.close()
except Exception as e:
    logging.exception("\n"+"\n"+'Erreur_Enregist_events : ' + time.strftime("%d/%m/%Y à %H:%M:%S")+"\n" + str(e)+"\n"+"\n")

J'ai retiré toutes les implications qu'entrainent les elif autre que celui lié à la zone de test, pour ne pas dépasser les 20 000 caractères.
Mais celle qui doit absolument être réactive c'est la première, celle liée au lumière.
Titre: Script python lancé en double, pourquoi
Posté par: kgersen le 25 octobre 2020 à 23:35:50
la premiere ligne du profiling en python indique

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        3    6.038    2.013    6.038    2.013 {method 'read' of '_io.BufferedReader' objects}

un 'read' est appelé 3 fois (ncalls) et chaque appel prend 2 secondes (percall) ce qui rajoute 6 secondes au temps total... curieux. il faudrait trouver d'ou vient ce "read".
Je ne vois pas trop ou dans ton script a quoi ce read correspond.


Il faudrait le 'output' (les print) de ton script lors que l'execution pour voir ce qui se passe plus en détail.

sinon utiliser pprofile:

- installation: pip install pprofile
- exécution: pprofile  tonscript.py parametres eventuels
Titre: Script python lancé en double, pourquoi
Posté par: Darkjeje le 26 octobre 2020 à 22:15:59
la premiere ligne du profiling en python indique

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        3    6.038    2.013    6.038    2.013 {method 'read' of '_io.BufferedReader' objects}

un 'read' est appelé 3 fois (ncalls) et chaque appel prend 2 secondes (percall) ce qui rajoute 6 secondes au temps total... curieux. il faudrait trouver d'ou vient ce "read".
Je ne vois pas trop ou dans ton script a quoi ce read correspond.


Il faudrait le 'output' (les print) de ton script lors que l'execution pour voir ce qui se passe plus en détail.

sinon utiliser pprofile:

- installation: pip install pprofile
- exécution: pprofile  tonscript.py parametres eventuels

Je ne peux malheureusement pas installer pprofile, compte tenu que ma connexion internet est coupée (étape 2).
Je testerai dès que possible.
Titre: Script python lancé en double, pourquoi
Posté par: Darkjeje le 15 novembre 2020 à 19:07:20
la premiere ligne du profiling en python indique

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        3    6.038    2.013    6.038    2.013 {method 'read' of '_io.BufferedReader' objects}

un 'read' est appelé 3 fois (ncalls) et chaque appel prend 2 secondes (percall) ce qui rajoute 6 secondes au temps total... curieux. il faudrait trouver d'ou vient ce "read".
Je ne vois pas trop ou dans ton script a quoi ce read correspond.


Il faudrait le 'output' (les print) de ton script lors que l'execution pour voir ce qui se passe plus en détail.

sinon utiliser pprofile:

- installation: pip install pprofile
- exécution: pprofile  tonscript.py parametres eventuels

Salut kgersen,

J'ai fini par récupérer une connexion internet pour me remettre à tester mon script.
Finalement, j'ai cherché un autre moyen de connexion à mysql et j'ai trouvé PyMySQL.
C'est le jour et la nuit à la place de mysql-connector.
Là où je mettais 37 secondes à récupérer et enregistrer mes consommations électrique de la journée, PyMySQL le fait en moins de 3 secondes.
J'ai encore pas mal de bug Broken pipe que je n'arrive pas à comprendre. Bug qui était déjà présent avec mysql-connector, mais au moins j'ai retrouvé la réactivité du script.

Erreur_Enregist_events : 15/11/2020 à 18:02:07
[Errno 32] Broken pipe

Traceback (most recent call last):
  File "/home/pi/Script_Cron_Domotique/Enregistrement_evenements.py", line 107, in <module>
    print (DateFrance + " : " + DataDecode + " = Retour du Webserveur avant tout if")
BrokenPipeError: [Errno 32] Broken pipe

Tu aurais une idée pour trouver d'où vient le problème, la ligne communiquée pouvant ne pas toujours être la même ?
Titre: Script python lancé en double, pourquoi
Posté par: kgersen le 15 novembre 2020 à 23:46:53
J'ai encore pas mal de bug Broken pipe que je n'arrive pas à comprendre. Bug qui était déjà présent avec mysql-connector, mais au moins j'ai retrouvé la réactivité du script.

Erreur_Enregist_events : 15/11/2020 à 18:02:07
[Errno 32] Broken pipe

Traceback (most recent call last):
  File "/home/pi/Script_Cron_Domotique/Enregistrement_evenements.py", line 107, in <module>
    print (DateFrance + " : " + DataDecode + " = Retour du Webserveur avant tout if")
BrokenPipeError: [Errno 32] Broken pipe

Tu aurais une idée pour trouver d'où vient le problème, la ligne communiquée pouvant ne pas toujours être la même ?

tu lance comment ton script (y'a une redirection > ou un |) ? c'est toujours sur un 'print' l'erreur ? python2 ou python3 ?
Titre: Script python lancé en double, pourquoi
Posté par: Darkjeje le 16 novembre 2020 à 08:17:50
tu lance comment ton script (y'a une redirection > ou un |) ? c'est toujours sur un 'print' l'erreur ? python2 ou python3 ?

Mon script est lancé par le crontab suivant :
# Lancement du script python d'écoute du web serveur à l'allumage du raspberry :
@reboot sleep 25 && python3 /home/pi/Script_Cron_Domotique/Enregistrement_evenements.py date >> /home/pi/Script_Cron_Domotique/cron_Web_Serveur.log 2>&1

Il plante toutes les heures au moment ou le serveur domotique envoi les informations de la consommation électrique demandée par un autre script python3 lancé par le crontab suivant :
# Plannification de la lecture du relevé de la consommation en Wh par heure sans enregistrement, tout les heures à passée de 3 minutes :
3 * * * * python /home/pi/Script_Cron_Domotique/Conso_par_jour_sans_enregistrement.py date >> /home/pi/Script_Cron_Domotique/cron_conso.log 2>&1

Bizarrement j'ai lancé le même script Enregistrement_evenements.py via la commande sudo python3 Enregistrement_evenements.py en mode terminal (en même temps qu'il était déjà lancé via le crontab, et alors que cette dernière version a planté avec le code erreur broken pip, celui lancé via le terminal n'a pas planté.
Titre: Script python lancé en double, pourquoi
Posté par: kgersen le 16 novembre 2020 à 11:08:39
C'est probablement du a la redirection et la bufférisassions. il faudrait gérer correctement les erreurs d'I/O mais bon.

Tu peux éventuellement ajouté l'option "-u":

@reboot slee 25 && python3 -u /home/pi/....
aussi évite de mélanger python 2 et 3.Ton deuxième script utilise 'python' , le premier utilise 'python3'.
Titre: Script python lancé en double, pourquoi
Posté par: Darkjeje le 16 novembre 2020 à 22:47:44
C'est probablement du a la redirection et la bufférisassions. il faudrait gérer correctement les erreurs d'I/O mais bon.

Tu peux éventuellement ajouté l'option "-u":

@reboot slee 25 && python3 -u /home/pi/....
aussi évite de mélanger python 2 et 3.Ton deuxième script utilise 'python' , le premier utilise 'python3'.

J'ai rajouté le "-u" et tout mes scripts Python sont lancés avec Python3 dans mon crontab.
Malheureusement j'ai toujours la même anomalie lorsque le serveur envoi les données de consommation.
Titre: Script python lancé en double, pourquoi
Posté par: kgersen le 17 novembre 2020 à 11:23:43
y'a la solution 'brutale' mais ca peut avoir des effets secondaires:

from signal import signal, SIGPIPE, SIG_DFL
signal(SIGPIPE,SIG_DFL)

a ajouter au début de ton script
Titre: Script python lancé en double, pourquoi
Posté par: Darkjeje le 28 novembre 2020 à 22:43:18
y'a la solution 'brutale' mais ca peut avoir des effets secondaires:

from signal import signal, SIGPIPE, SIG_DFL
signal(SIGPIPE,SIG_DFL)

a ajouter au début de ton script

Je n'ai pas vue de changement positif avec cela.
En fait à chaque plantage, je n'avais plus rien d'inscrit dans mes logs.

J'ai modifié mon script et je suis revenu à la situation antérieure au plantage de mon Rasp, c'est à dire que mon script est relancé environ toutes les 4 à 5 heures, et cela toujours avec le message peu clair de BrokenPipeError: [Errno 32] Broken pipe

J'ai testé en lançant le script depuis une fenêtre Putty à distance. Le script a tourné 9 heures sans planté et je l'ai donc arrêté.
As-tu une idée de ce qui pourrait provoquer une erreur Broken pipe lorsque le script est lancé depuis cron ou relancé depuis un autre script python, mais ne pas planté lorsqu'il est lancé via une fenêtre Putty ?
C'est très étonnant je trouve.
Titre: Script python lancé en double, pourquoi
Posté par: kgersen le 29 novembre 2020 à 13:07:18
J'ai testé en lançant le script depuis une fenêtre Putty à distance. Le script a tourné 9 heures sans planté et je l'ai donc arrêté.
As-tu une idée de ce qui pourrait provoquer une erreur Broken pipe lorsque le script est lancé depuis cron ou relancé depuis un autre script python, mais ne pas planté lorsqu'il est lancé via une fenêtre Putty ?
C'est très étonnant je trouve.

oui si l'erreur est sur un "print" et qu'il y a une redirection ca peut expliquer cela.

comme indiqué déja la bonne solution est "de gérer correctement les erreurs". (avec des try).

si un "print" plante avec ce message, c'est en principe parce que la sortie est fermée ou pas dispo (buffer plein).

apres on n'a pas plus de détails (script complet, comment il est lancé en détail,  message d'erreur détaillé) pour t"éclairer plus.
Titre: Script python lancé en double, pourquoi
Posté par: Darkjeje le 05 décembre 2020 à 18:03:54
oui si l'erreur est sur un "print" et qu'il y a une redirection ca peut expliquer cela.

comme indiqué déja la bonne solution est "de gérer correctement les erreurs". (avec des try).

si un "print" plante avec ce message, c'est en principe parce que la sortie est fermée ou pas dispo (buffer plein).

apres on n'a pas plus de détails (script complet, comment il est lancé en détail,  message d'erreur détaillé) pour t"éclairer plus.

Merci beaucoup pour ton aide.
Ton dernier message m'a mis la puce à l'oreille, lorsque tu as mentionné le buffer plein.

Les dernières erreurs étaient sur des print.
J'ai supprimé tous les print hors erreur et cela fait maintenant 4 jours que le script n'a pas planté.
Je suppose donc que l'accumulation de print à chaque commande de la domotique finissait par saturer le buffer et plantait le script.

Un grand merci à toi qui m'a permis de comprendre les fonctions et ainsi m'améliorer un petit peu en Python  :D