[resolu]probleme lancement script python

Python est le langage de prédilection du Raspberry Pi

Modérateurs : Francois, Manfraid

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

Re: probleme lancement script python

Message par Manfraid » mer. 24 déc. 2014 17:26

en fait je pense que peu importe le système de stockage des paramètres, ils sont tout aussi puissant l'un que l'autre, c'est plus je pense une question d'habitude

personnellement comme j'utilise souvent le JSON pour les requêtes AJAX j'ai une tendance a utilisé ce système.

mais la ou je ne suis pas d'accord avec toi sur le fait que stocker en python est plus pour des variables simples c'est que c'est tu peu en plus créer ta connexion a la base de donnée dans ton fichier de paramètre et utilisé cette connexion dans le script normal
NAS : DIY OS Debian: DD250Go + 3x2To + 6To
Raspberry pi : 2B OS : Raspbian
Se tromper est humain, Vraiment foutre la merde nécessite le mot de passe de root.

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

Re: probleme lancement script python

Message par Manfraid » mer. 24 déc. 2014 17:31

au fait voila ton script adapter pour le python2 mais le truc qui me parait bizarre c'est le mélange de code pour python2 et python 3, je te conseille d'essayer de le lancer a la main et de mettre ici le retour car c'est sur il y aura des messages d'erreur

Code : Tout sélectionner

#!/usr/bin/python2.7

import RPi.GPIO as GPIO
import os
import time
#import gdata.calendar.service  
#import gdata.calendar 
#import atom.service
#import atom
#import gdata.service 
import datetime
import MySQLdb
import httplib2

from RPi import GPIO

from apiclient.discovery import build
from oauth2client.file import Storage
from oauth2client.client import AccessTokenRefreshError
from oauth2client.client import OAuth2WebServerFlow
from oauth2client.tools import run_flow
from oauth2client.client import flow_from_clientsecrets

GPIO.setmode (GPIO.BOARD)
GPIO.setup(15,GPIO.OUT)
GPIO.setup(16,GPIO.OUT)
GPIO.setup(18,GPIO.OUT)
GPIO.setup(21,GPIO.OUT)


#parametre de connexion au compte google pour recuperer l'agenda

#cal_client = gdata.calendar.service.CalendarService()  
#cal_client.email = "user@gmail.com"  
#cal_client.password = "mdp"  
#cal_client.source = 'Google-Calendar_Python_Sample-1.0'  
#cal_client.ProgrammaticLogin()  
            


#definition de la categorie pour les log
cat='Piscine'
#pompemarche=0
#evenement=0

#connexion a la base SQL
mydb=MySQLdb.connect (host="192.168.1.5",port=3306, user="toto", passwd="mdp", db="logdomo")
mycursor=mydb.cursor()

#recuperation du mode de fontionnement dans la base SQL

mycursor.execute('SELECT pompe FROM variables WHERE ID=1')
enr=mycursor.fetchall()
for row in enr:
   for col in row :
      pompe=col
      pompe=int(pompe)
print pompe

#recuperation de l'etat actuelle de la pompe
mycursor.execute('SELECT pompemarche FROM variables WHERE ID=1')
enr=mycursor.fetchall()
for row in enr:
   for col in row :
      pompemarche=col
      pompemarche=int(pompemarche)
print pompemarche

#recuperation de l'etat precedent de la pompe
mycursor.execute('SELECT etatpompe FROM variables WHERE ID=1')
enr=mycursor.fetchall()
for row in enr:
   for col in row :
      evenement=col
      evenement=int(evenement)
print evenement

mycursor.close()
mydb.close()
   

if pompe==1:    #si la pompe passe a l'arret, inscription dans les log
   pompemarche=0
   mydb=MySQLdb.connect (host="192.168.1.5",port=3306, user="toto", passwd="mdp", db="logdomo")
   mycursor=mydb.cursor()
   mycursor.execute ('UPDATE variables SET pompemarche=0 WHERE ID=1')
   mydb.commit()
   mycursor.close()
   mydb.close()   
   GPIO.output (21, True) # et arret de la pompe
   GPIO.output (15, True)
   GPIO.output (16, False)
   GPIO.output (18, False)

elif pompe==2:   #si la pompe passe en marche programme

        GPIO.output (15, False)
   GPIO.output (16, True)
   GPIO.output (18, False)   

        #verification de l'agenda du jour pour voir si il y a des evenements prevus   
   
        scope = 'https://www.googleapis.com/auth/calendar'
        flow = flow_from_clientsecrets('client_secret.json', scope=scope)

        storage = Storage('credentials.dat')
        credentials = storage.get()

        class fakeargparse(object):  # fake argparse.Namespace
            noauth_local_webserver = True
            logging_level = "ERROR"
        flags = fakeargparse()

        if credentials is None or credentials.invalid:
            credentials = run_flow(flow, storage, flags)

        http = httplib2.Http()
        http = credentials.authorize(http)
        service = build('calendar', 'v3', http=http)

        # get the next 12 hours of events
        epoch_time = time.time()
        print epoch_time
        start_time = epoch_time - 3600  # 1 hour ago
        end_time = epoch_time + 12 * 3600  # 12 hours in the future
        tz_offset = - time.altzone / 3600
        if tz_offset < 0:
            tz_offset_str = "-%02d00" % abs(tz_offset)
        else:
            tz_offset_str = "+%02d00" % abs(tz_offset)

        start_time = datetime.datetime.fromtimestamp(start_time).strftime("%Y-%m-%dT%H:%M:%S") + tz_offset_str
        end_time = datetime.datetime.fromtimestamp(end_time).strftime("%Y-%m-%dT%H:%M:%S") + tz_offset_str
        #start_time = datetime.datetime.now()
        #end_time = datetime.datetime.now()
        print "Getting calendar events between: " + start_time + " and " + end_time

        print start_time
        print end_time

        events = service.events().list(calendarId='id@group.calendar.google.com', timeMin=start_time, timeMax=end_time, singleEvents=True).execute()
        #pprint.pprint(events)
        for event in events['items']:
            print event["summary"]
            print event["start"]
            str_date_deb=event["start"]
            print str_date_deb
            print type (str_date_deb)
            print event["end"]
            str_date_fin=event["end"]
            print str_date_fin

            str_date_deb=str(str_date_deb)
            date_deb = datetime.datetime(int(str_date_deb[16:20]) , int(str_date_deb[21:23]), int(str_date_deb[24:26]), int(str_date_deb[27:29]), int(str_date_deb[30:32]), int(str_date_deb[33:35]))  
 
            str_date_fin=str(str_date_fin)
            date_fin = datetime.datetime(int(str_date_fin[16:20]) , int(str_date_fin[21:23]), int(str_date_fin[24:26]), int(str_date_fin[27:29]), int(str_date_fin[30:32]), int(str_date_fin[33:35]))  

            print date_deb
            print date_fin 

     
    
            maintenant=datetime.datetime.now()
            maintenant=str(maintenant)
            print maintenant
            la = datetime.datetime(int(maintenant[0:4]) , int(maintenant[5:7]), int(maintenant[8:10]), int(maintenant[11:13]), int(maintenant[14:16]), int(maintenant[17:19]))  
            #maintenant=maintenant[0:19]
            #maintenant=datetime.datetime(int(maintenant))
            #print maintenant
            print la




       #inscription dans les log du la mise en marche programme
       evenement=0
       mydb=MySQLdb.connect (host="192.168.1.5",port=3306, user="toto", passwd="mdp", db="logdomo")
       mycursor=mydb.cursor()
       mycursor.execute ('UPDATE variables SET etatpompe=0 WHERE ID=1')
       mydb.commit()
       mycursor.close()   
       print evenement
   
            if ((date_deb<=la) and (date_fin>=la)):  #si on se trove pendant un evenement
                print 'action en cours'
           #print ("Cons.:",event.title.text) 
      print pompemarche
      print 'en periode'
      #pompemarche=1
      evenement=1 #enregistrement de l'etat de la pompe pour le prochain test
      mydb=MySQLdb.connect (host="192.168.1.5",port=3306, user="toto", passwd="mdp", db="logdomo")   #log du demarrage du programme
      mycursor=mydb.cursor()
      mycursor.execute ('UPDATE variables SET etatpompe=1 WHERE ID=1')
      mydb.commit()
      mycursor.close()   
      print evenement
      #GPIO.output (21, False)
      #break

            else:    # si on est hors periode
                print 'pas d action'
      print 'hors periode'
      #pompemarche=0
      #evenement=0
      #GPIO.output (21, True)
      #break

         
      
               
               

      
   if evenement==1 :   # si la pompe doit marcher
      if pompemarche==0 :    #mais qu'elle etait arrete jusqu'a maintenant on log le demarrage
         print ('demarrage programme')
         j= time.strftime('%d-%m-%Y')
         h=time.strftime('%H:%M:%S')
         m='demarrage programme'
         mydb=MySQLdb.connect (host="192.168.1.5",port=3306, user="toto", passwd="mdp", db="logdomo")
         mycursor=mydb.cursor()
         mycursor.execute ('INSERT INTO log (jour, heure, categorie, action) VALUES (%s,%s,%s,%s)',(j,h,cat,m))
         mydb.commit()
         mycursor.close()
      pompemarche=1
      #print ('arret systeme pompe')
      mydb=MySQLdb.connect (host="192.168.1.5",port=3306, user="toto", passwd="mdp", db="logdomo")  #et on confirme qu'elle est en marche
      mycursor=mydb.cursor()
      mycursor.execute ('UPDATE variables SET pompemarche=1 WHERE ID=1')
      mydb.commit()
      mycursor.close()
      GPIO.output (21, False)  #on met la pompe en marche

   elif evenement==0:  #si la pompe doit etre a l'arret
      if pompemarche==1 : #et qu'elle etait en marche precedemment, on log la mise a l'arret
         print 'arret programme'
         j= time.strftime('%d-%m-%Y')
         h=time.strftime('%H:%M:%S')
         m='arret programme'
         mydb=MySQLdb.connect (host="192.168.1.5",port=3306, user="toto", passwd="mdp", db="logdomo")
         mycursor=mydb.cursor()
         mycursor.execute ('INSERT INTO log (jour, heure, categorie, action) VALUES (%s,%s,%s,%s)',(j,h,cat,m))
         mydb.commit()
         mycursor.close()
      pompemarche=0  #on confirme qu'elle est arrete
      #print ('arret systeme pompe')
      mydb=MySQLdb.connect (host="192.168.1.5",port=3306, user="toto", passwd="mdp", db="logdomo")
      mycursor=mydb.cursor()
      mycursor.execute ('UPDATE variables SET pompemarche=0 WHERE ID=1')
      mydb.commit()
      mycursor.close()
      GPIO.output (21, True)   #on arrete la pompe



   
elif pompe==3:   #si la pompe passe en mode marche forcee
   #print ('demarrage marche force')
   pompemarche=1
   mydb=MySQLdb.connect (host="192.168.1.5",port=3306, user="toto", passwd="mdp", db="logdomo")   #on confirme sont etat en marche
   mycursor=mydb.cursor()
   mycursor.execute ('UPDATE variables SET pompemarche=1 WHERE ID=1')
   mydb.commit()
   mycursor.close()
   GPIO.output (21, False)  #on met la pompe en marche
   GPIO.output (15, False)
   GPIO.output (16, False)
   GPIO.output (18, True)
   
print"pompe 1=" , pompemarche, "   "
   
   #time.sleep(30)
   
NAS : DIY OS Debian: DD250Go + 3x2To + 6To
Raspberry pi : 2B OS : Raspbian
Se tromper est humain, Vraiment foutre la merde nécessite le mot de passe de root.

zeverybest
Raspinaute
Messages : 136
Enregistré le : sam. 18 oct. 2014 19:09

Re: probleme lancement script python

Message par zeverybest » mer. 24 déc. 2014 17:55

Merci pour l'aide

Je vais essayer ce code

Penses tu que le mélange Python 2et Python 3 puisse être à l'origine du probleme d'un script qui fonctionne en ligne de commande et pas dans le cron?

De toutes façons, les PRINT ne servent pas au fonctionnement du script mais uniquement pour voir étape par étape si cela fonctionne
Je peux les retirer par un #

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

Re: probleme lancement script python

Message par Manfraid » mer. 24 déc. 2014 18:11

déja je suis surpris qu'il fonctionne en ligne de commande
NAS : DIY OS Debian: DD250Go + 3x2To + 6To
Raspberry pi : 2B OS : Raspbian
Se tromper est humain, Vraiment foutre la merde nécessite le mot de passe de root.

mike913
Raspinaute
Messages : 247
Enregistré le : mar. 7 oct. 2014 09:46
Localisation : Morsang / Orge - Essonne
Contact :

Re: probleme lancement script python

Message par mike913 » mer. 24 déc. 2014 19:19

Manfraid a écrit :en fait je pense que peu importe le système de stockage des paramètres, ils sont tout aussi puissant l'un que l'autre, c'est plus je pense une question d'habitude

personnellement comme j'utilise souvent le JSON pour les requêtes AJAX j'ai une tendance a utilisé ce système.

mais la ou je ne suis pas d'accord avec toi sur le fait que stocker en python est plus pour des variables simples c'est que c'est tu peu en plus créer ta connexion a la base de donnée dans ton fichier de paramètre et utilisé cette connexion dans le script normal
L' avantage pour moi des fichiers de configuration c'est que le même fichier *.ini peut-être utilisé aussi bien par mes scripts python que par mes scripts PHP
DS712+ 2x Western Digital WD10EADS-00L 1000 GB (SHR) - Firmware: DSM 6.1.6-15266
Raspberry - RFXTRX433 - Aeon Labs ZStick V2 - Domoticz
FreeBox v6
https://meteo.folcke.net
https://wiki.folcke.net

zeverybest
Raspinaute
Messages : 136
Enregistré le : sam. 18 oct. 2014 19:09

Re: probleme lancement script python

Message par zeverybest » mer. 24 déc. 2014 23:02

Manfraid a écrit :déja je suis surpris qu'il fonctionne en ligne de commande
Ben mon script fonctionnait

Mais celui que tu m'a corrigé pour Python 2.7 ne fonctionne pas

Il me fait une erreur sur l'accès à l'agenda

Je ne vois pas pourquoi

A part les instructions PRINT, je n'arrive pas à voir ce que tu as modifié dans le script pour l'adapter à Python 2.7

zeverybest
Raspinaute
Messages : 136
Enregistré le : sam. 18 oct. 2014 19:09

Re: probleme lancement script python

Message par zeverybest » mer. 24 déc. 2014 23:14

J'avais pas vu qu'on était déjà le 25

Joyeux Noël a tous

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

Re: probleme lancement script python

Message par Manfraid » ven. 26 déc. 2014 08:21

fait une copie du message d'erreur ainsi que la ligne de commande que tu saisie
NAS : DIY OS Debian: DD250Go + 3x2To + 6To
Raspberry pi : 2B OS : Raspbian
Se tromper est humain, Vraiment foutre la merde nécessite le mot de passe de root.

zeverybest
Raspinaute
Messages : 136
Enregistré le : sam. 18 oct. 2014 19:09

Re: probleme lancement script python

Message par zeverybest » ven. 26 déc. 2014 11:12

En fait, il n'y a pas de message d'erreur

Celui que j'obtenais provenait du fait que tu avais (intelligemment) supprimer l'ID de l'agenda que j'avais bettement laissé en clair. J'avais oublié de le remettre

donc, le script fonctionne bien lorsque je le lance depuis une fenetre terminal (sudo python pompe2.py ou python pompe2.py lorsque je suis loggé en ROOT)
Mais ne fonctionne pas lorsque je mets * * * * * sudo python /var/www/pompe2.py dans le CRON

Alors que cette meme ligne fonctionnait lorsque le script python etait ecrit pour l'API google V2

Je suis désespèré

domi
Administrateur
Messages : 3233
Enregistré le : mer. 17 sept. 2014 18:12
Localisation : Seine et Marne

Re: probleme lancement script python

Message par domi » ven. 26 déc. 2014 11:43

Bonjour,

Apparemment tu utilises le Cron de l'utilisateur courant puisse que tu mets un "Sudo" dans ta ligne de commande.

Si ton script doit être exécuté en tant que Root, ce qu'il faut faire pour exécuter une commande Cron via le user Root, c'est mettre ta commande dans la CronTab de Root.

Pour cela :

Code : Tout sélectionner

sudo crontab -e
Puis tu mets ta commande sans le sudo.
Passionné de Raspberry, Arduino, ESP8266, ESP32, et objets connectés :
Spécial débutant, concevez vous-même votre domotique DIY : https://www.youtube.com/c/DomoticDIY
Conception d'une station météo DIY, et envoi des infos à votre Domotique.

Répondre

Retourner vers « Python »