Forum Programmation.python Automatiser tache python a partir d'un fichier Txt sur raspberry

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
0
3
fév.
2015

Bonjour , je souhaite automatiser mon programme gmail.py ,ce programme me sert a envoyé des mails avec pièces jointes.

Actuellement ce programme fonctionne quand je le lance par putty ( Console).

Ce que je souhaite faire:
je voudrais que l'envoie du mail se fasse automatiquement si le fichier texte (SOstate)est present sur mon raspberry .

Pour être plus précis , je capte un code émis en 433Mhz,ce code traiter me crée un fichier SO-state.txt, qui ensuite prend une photos provenant d'une camera IP. On envoye le mail , et on vide SOstate et So.

#!/usr/bin/env python
import smtplib
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email.Utils import COMMASPACE, formatdate
from email import Encoders
import os

USERNAME = "adre@gmail.com"
PASSWORD = "123"
NAME = "PiHome"
SOstate='/home/www/logs/SO-state.txt'
So='/home/www/capture/sonnette.jpg'

def sendMail(to, subject, text, files=[]):
    assert type(to)==list
    assert type(files)==list

    msg = MIMEMultipart()
    msg['From'] = 'PiHome <adre@gmail.com>'
    msg['To'] = COMMASPACE.join(to)
    msg['Date'] = formatdate(localtime=True)
    msg['Subject'] = subject

    msg.attach( MIMEText(text) )

    for file in files:
        part = MIMEBase('application', "octet-stream")
        part.set_payload( open(file,"rb").read() )
        Encoders.encode_base64(part)
        part.add_header('Content-Disposition', 'attachment; filename="%s"'
                       % os.path.basename(file))
        msg.attach(part)

    server = smtplib.SMTP('smtp.gmail.com:587')
    server.ehlo_or_helo_if_needed()
    server.starttls()
    server.ehlo_or_helo_if_needed()
    server.login(USERNAME,PASSWORD)
    server.sendmail(USERNAME, to, msg.as_string())
    server.quit()


sendMail( ["4@free.fr"],
        "Sonnette",
        "Sonnette rue !",
        ["/home/www/capture/sonnette.jpg"] )
# Suppression de SOstate
os.remove(SOstate)
os.remove(So)
  • # inotifywait

    Posté par  . Évalué à 1.

  • # Automatiser tache python a partir d'un fichier Txt sur raspberry

    Posté par  . Évalué à 1.

    Merci inotifywait pour ton liens mais ca me parait très compliqué ! ( pour moi débutant ) je pensais que l'on pouvais ajouter quelques chose dans mon script python .

    • [^] # Re: Automatiser tache python a partir d'un fichier Txt sur raspberry

      Posté par  . Évalué à 3.

      ben ce que tu cherches, c'est à lancer ton script quand un fichier apparait,
      s'il n'y a pas de fichier ce serait dommage d'user du processeur en attendant à ne rien faire.

      donc il faut un truc qui :
      - detecte la presence du fichier
      - execute le script

      ah ben tiens, c'est justement ce que fait inotify
      il surveille un dossier/fichier, et quand il change, il execute une action…

      bon parce que sinon, tu peux aussi ajouter une boucle for/while qui va tourner dans le vide, et regarder toutes les X boucles s'il y a un fichier dans le dossier, mais ce ne sera pas optimisé, ca va bouffer du CPU, alors que le systeme dispose d'un truc qui est fait pour ca.

    • [^] # Re: Automatiser tache python a partir d'un fichier Txt sur raspberry

      Posté par  (site Web personnel) . Évalué à 3.

      En Python, l'équivalent de inotify, c'est pyinotify, un exemple d'utilisation tout bête, quand est fichier est complètement copié dans un répertoire donné (évènement CLOSE_WAIT), alors on déclenche une action

      http://forum.ubuntu-fr.org/viewtopic.php?id=916501

      ウィズコロナ

  • # Automatiser tache python a partir d'un fichier Txt sur raspberry

    Posté par  . Évalué à 1.

    Bonsoir NeoX , tu as tout compris , il faut détecté la présence du fichier SO-state.txt et ensuite exécuté le script Gmail.py
    Je vais faire des recherches pour comprendre comment fonctionne inotify

    • [^] # Re: Automatiser tache python a partir d'un fichier Txt sur raspberry

      Posté par  . Évalué à 3.

      si tu n'es pas à la seconde pres,
      tu peux faire un cron qui va tourner toutes les minutes et au choix :

      • lancer un script qui test la presence du fichier, et lance ton gmail.py

      ou

      • lance ton script gmail.py, qui devra inclure une fonction qui regarde si le fichier so-state existe et envoie l'email dans ce cas là
  • # Automatiser tache python a partir d'un fichier Txt sur raspberry

    Posté par  . Évalué à 1.

    Bonjour NeoX j'ai un fichier en C++ qui tourne en tache Cron pour détecter le code en 433Mhz , et ça me crée et m'ecrit le mot Dring dans le fichier SO-state.txt .Est ce que ce n'est pas a partir de ce fichier que je devrais ajir ? .

  • # Automatiser tache python a partir d'un fichier Txt sur raspberry

    Posté par  . Évalué à 1.

    '''Mais à ce compte là, pourquoi ne pas carrément écrire et envoyer le mail en C++ '''

    Parce que je ne sais pas faire !!

    Ma première idée c’était l'envoie d'un MMS , ( Dongle relié sur raspberry ) , mais ne trouvant pas de solution , je me suis rabattu vers l'envoie d’émail avec pièces jointes .

    • [^] # Re: Automatiser tache python a partir d'un fichier Txt sur raspberry

      Posté par  . Évalué à 3.

      Tu as bien su ecrire du code Python pour envoyer un email (ou le copier d'internet)
      il doit bien y avoir des exemples en C++ sur internet pour faire la meme chose.

      Parce que là, tu as quand meme un gros enchainement pas optimiser du tout.

      • cron qui lance la tache C++
      • la tache C++ qui ecrit sur le disque (ou pas selon le signal recu)
      • la tache C++ qui va appeler python
      • python qui va lancer ton gmail.py
      • gmail.py qui va envoyer l'email et effacer le fichier
      • python qui va liberer le shell
      • la tache C++ qui va se terminer.

      ah, et sinon, quand tu veux repondre à quelqu'un sur le forum, il faut cliquer sur "Repondre" en dessous de son post, plutot que sur "envoyer un commentaire".

      • [^] # Re: Automatiser tache python a partir d'un fichier Txt sur raspberry

        Posté par  . Évalué à 1. Dernière modification le 04/02/15 à 18:42.

        Je sais c'est un peux une usine a gaz mon truc !!
        Pour expliquer un peux ma situation ,Il y a 2 ans j’ai commencé un projet de domotique sur un raspberry avec un ami, toute la partie électronique est de moi, et la partie programmation c’était lui.
        Actuellement, il est très malade et fatigué, et ne peux plus m’aider. Je me retrouve donc dans l’impasse. Et mon projet n’est hélas pas fini. j'essaye donc de me débrouillé seul avec mes faible connaissance en programmation !

        Mon fichier en language C++ ( RFSniffer )tourne 24/24 par une tache Cron , ce fichier capte des codes en 433Mhz que je lui ai indiqué ( Alarme ,Alarme Incendie , Boite au lettre et sonnette ) ce fichier crée a chaque détection un fichier texte qui est exploité ensuite par une page Php pour l'affichage ,ou pour l'envoie de SMS ( Alarme ) .

        Merci pour l'info du bouton répondre , je ne l'avais pas vu.

      • [^] # Re: Automatiser tache python a partir d'un fichier Txt sur raspberry

        Posté par  . Évalué à 1.

        Bonjour NeoX , je suis en train de suivre des conseils, j'essaye de modifier mon fichier C++ afin de supprimer des étapes . mais j'ai encore un probleme . impossible Make !!
        Je capte le code radio radio_code==BPSO et je veux capturer la photos et ensuite l'envoyé par Mail . voila ce que j'ai fais

        // Sonnette  Capture des photos depuis camera IP Nord
        
                            if (radio_code==BPSO){('http://192.168.1.18:80/cgi-bin/net_jpeg.cgi?ch=1','/home/www/capture/sonnette.jpg');}
                                {system("python /home/www/py/gmail.py");
                                        }           
                            // Fin Sonnette

        voila l'erreur que j'ai
        cpp:140:29: warning: character constant too long for its type [enabled by default]
        RFSniffer.cpp:140:80: warning: character constant too long for its type [enabled by default]

        • [^] # Re: Automatiser tache python a partir d'un fichier Txt sur raspberry

          Posté par  . Évalué à 2.

          je ne connais pas ton code en particulier, et ne suis pas expert en C++, mais une fois remise en forme pour respecter les accolades ouvrantes/fermantes et l'indentation, ca me surprend de voir :

          // Sonnette  Capture des photos depuis camera IP Nord
          if (radio_code==BPSO){
              ('http://192.168.1.18:80/cgi-bin/net_jpeg.cgi?ch=1','/home/www/capture/sonnette.jpg');
          }
          
          {
               system("python /home/www/py/gmail.py");
          }           
          // Fin Sonnette

          ton appel à system se fait en dehors de la condition if radio_code==BPSO,
          pour moi cela devrait se faire dans la foulée, mais toujours conditionné par la reception du code BPSO, donc etre ecrit comme ca :

          // Sonnette  Capture des photos depuis camera IP Nord
          if (radio_code==BPSO){
              ('http://192.168.1.18:80/cgi-bin/net_jpeg.cgi?ch=1','/home/www/capture/sonnette.jpg');
          
               system("python /home/www/py/gmail.py");
          }           
          // Fin Sonnette

          tu peux aussi aller lire le code à la ligne 140, entre le caractere 29 et 80 car visiblement CPP rale à cet endroit là.

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n’en sommes pas responsables.