IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Symfony - Exécuter un script Python


Sujet :

Symfony PHP

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2018
    Messages : 7
    Points : 3
    Points
    3
    Par défaut Symfony - Exécuter un script Python
    Bonjour à tous,

    Je travaille actuellement sur un projet Symfony qui vise à envoyer des données à un objet connecté, et j'utilise la version 3.4.15 .

    Dans l'application que je développe, un script Python doit se lancer après la validation de formulaires d'ajout et de modification des données. La vocation de ce script Python est de récupérer (via des requêtes sql) les données qui ont été enregistrées en bdd après la soumission du formulaire. Ce script s'exécute donc côté serveur.

    Aucune donnée n'est envoyée au script par Symfony. Le script est censé être déclenché par Symfony et générer des requêtes sql.

    Ma problématique est la suivante : pour récupérer les données en bdd , le script Python doit donc se lancer après le flush() effectué par le contrôleur . Or, je ne vois
    pas comment implémenter ça dans Symfony et quelle syntaxe utiliser ? L'instruction doit-elle se situer juste après le flush(), ou doit-on utiliser un service et/ou le gestionnaire d'évènements ?

    Merci de votre aide

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2013
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2013
    Messages : 739
    Points : 1 022
    Points
    1 022
    Par défaut
    Bonjour,

    on peux mettre un event doctrine qui se lance apres un flush.
    Pensez a mettre ça dans des contrôleur est déconseillé
    https://symfony.com/doc/current/doct...bscribers.html

  3. #3
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2018
    Messages : 7
    Points : 3
    Points
    3
    Par défaut Symfony - Python
    Bonjour MehrezLabidi,

    Et Merci pour ta réponse. Je me doutais que c'était un peu plus complexe .

    Un event doctrine me parait plus adapté en effet.

    Je mets ça en place et te fais un retour sur le forum

  4. #4
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2018
    Messages : 7
    Points : 3
    Points
    3
    Par défaut Retour - tests
    Bonjour MehrezLabidi,

    Je reviens vers toi concernant ma problématique. Après plusieurs jours de tests, et en me basant sur la doc de Symfony, je n'arrive toujours pas à faire fonctionner mon code. Ca fait 4 mois que j'apprends à développer sur Symfony, et je bloque toujours sur l'utilisation du gestionnaire d'évènement Doctrine.

    Je n'ai aucune erreur ni exception, mais le service ne se lance pas lorsque l'évènement se produit.
    J'ai crée 2 classes : l'une pour le service censé s'exécuter, l'autre pour le listener qui écoute l'évènement. Les 2 classes sont taggées dans services.yml .

    Ce que je voudrais faire : lorsqu'une entité est persistée, un service exécute un script bash (qui appelle un script python qui lance une requête sql).

    Ci-dessous mon code :

    - services.yml
    - LedListener.php
    - FileLauncher.php


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    services:
     
      menu.led.file_launcher:
             class: ER\MenuBundle\Launcher\FileLauncher
     
     
      menu.doctrine_listener.led_listener:
        class: ER\MenuBundle\DoctrineListener\LedListener
        arguments:
          - "@menu.led.file_launcher"
        tags:
          - { name: doctrine.event_listener, event: postPersist }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    <?php
    //src/ER/MenuBundle/DoctrineListener/LedListener.php
     
    namespace ER\MenuBundle\DoctrineListener;
     
    use Doctrine\Common\Persistence\Event\LifecycleEventArgs;
    use ER\MenuBundle\Launcher\FileLauncher;
    use ER\MenuBundle\Entity\Led;
     
    class LedListener
    {
      /**
       * @var FileLauncher
       */
      private $fileLauncher;
     
      public function __construct(FileLauncher $fileLauncher)
      {
        $this->fileLauncher = $fileLauncher;
      }
     
      public function postPersist(LifecycleEventArgs $args)
      {
        $entity = $args->getObject();
     
        // On ne veut appeler le fichier bash que pour les entités Led
        if (!$entity instanceof Led) {
          return;
        }
     
        $this->fileLauncher->fileExecution($entity);
      }
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    <?php
    //src/ER/MenuBundle/Launcher/FileLauncher.php
     
    namespace ER\MenuBundle\Launcher;
     
    use ER\MenuBundle\Entity\Led;
     
    class FileLauncher
    {
     
     
      public function fileExecution(Led $led)
     
      {
     
    	 shell_exec('/bin/sh   /var/www/e_reveil/script/sbin/appele_cron.sh');
     
     
     
      }
    }


    Que cela soit au niveau de la configuration de l'event doctrine, ou de la commande d'appel du bash, je suis un peu perdu.

    Si tu avais quelques pistes ?


    Merci

  5. #5
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2013
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2013
    Messages : 739
    Points : 1 022
    Points
    1 022
    Par défaut
    Bonsoir,
    j'ai regardé l’évent et ca me parait OK.
    Maintenant on sait pas si le script sh se lance ou pas , si quand il se lance il fait le nécessaire ou pas.
    Ben on mets le retour de l’opérateur shell_exec dans une variable et on mets un dump de ce retour dans les fichiers logs.
    Si écrire dans le log sf parait difficile , on peut créer un simple fichier est mettre un message significatif pour ne pas se perdre.
    Meme dans le fichier appele_cron lui même on peut gérer les exceptions et écrire un peu de log.

  6. #6
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2018
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Bonjour ,

    Et merci de ta réponse.

    Dans ma méthode fileExecution, j'ai mis ceci :

    $output = shell_exec('/bin/sh /var/www/e_reveil/script/sbin/appele_cron.sh');

    var_dump($output);


    Mais je n'ai aucun retour .

    A ce stade, je ne sais pas si c'est mon event ou ma méthode fileExecution qui pose problème.

  7. #7
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2013
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2013
    Messages : 739
    Points : 1 022
    Points
    1 022
    Par défaut
    Je crois que c'est la commande qui fonctionne pas bien.
    pourquoi ne pas mettre en commentre cettre cmd sh et mettre une inscruction php simple à sa place ( genre creation de fichier ..) rien que pour tester d'ou viens le probleme , de l'event ou du shell.
    on peux mettre du log dans du shell comme ici
    https://www.linuxquestions.org/quest...cripts-779324/

  8. #8
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2018
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Salut,

    J'ai fait tous les tests que tu m'as indiqué.

    - L'event est OK . Il déclenche bien le bash après le flush() . J'ai fait une simulation de création de fichier et celui-ci se crée bien.

    - Le problème vient du bash qui ne parvient pas lancer le script python. De son côté le script python est OK, si je le teste dans un IDE de type Thonny IDE il fonctionne bien.

    C 'est la syntaxe du bash qui doit poser problème .

    Contenu :

    #! /bin/sh

    python3 /var/www/e_reveil/script/python/edit_cron_ok.py

    Le fichier python exécuté est bien en chmod +x .


    J'ai pourtant l'impression que c'est la bonne syntaxe.

Discussions similaires

  1. Exécuter un script python
    Par Drahas dans le forum Général Python
    Réponses: 19
    Dernier message: 03/02/2014, 21h44
  2. Exécuter un script python sur le serveur
    Par lesanglier dans le forum Général Python
    Réponses: 2
    Dernier message: 19/12/2013, 09h05
  3. Problème d'exécution de script Python dans une JSP
    Par bleno dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 17/07/2013, 09h41
  4. Exécuter un script python en ligne de commande DOS
    Par ero91 dans le forum Développement 2D, 3D et Jeux
    Réponses: 1
    Dernier message: 30/03/2013, 14h57
  5. Exécuter un script python depuis PHP
    Par Fawn_noOb_wxPython dans le forum Langage
    Réponses: 4
    Dernier message: 20/10/2008, 13h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo