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

Python Discussion :

utiliser le retour d'un programme


Sujet :

Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 81
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2019
    Messages : 5
    Points : 1
    Points
    1
    Par défaut utiliser le retour d'un programme
    Bonjour à tous

    Débutant en Python, je viens chercher de l'aide pour résoudre un problème sur lequel je butte depuis plusieurs semaines.
    J'essaie d'écrire un programme pour faire un jukebox RFID sur un raspberry.

    J'utilise le lecteur 'mpg123' sur lequel il est possible d’interagir pendant la lecture pour faire une pause ou passer au morceau suivant.
    Le problème est que 'mpg123' ne se ferme pas à la fin du morceau quand je le lance depuis mon script python (alors qu'il se ferme si je le lance depuis un script bash)
    Voici la partie du code qui concerne ce problème
    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
    #!/usr/bin/env python
    import os
    import pty
    import subprocess
    import popen
    import RPi.GPIO as GPIO
    Pause = 7
    GPIO.setup(Pause, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
    master, slave = os.openpty()
    path = "/home/pi/Desktop/07.mp3"
    p = subprocess.Popen(['mpg123', '-C',path ], stdin=master)
    while p.returncode ==  "None" :
       pause = GPIO.input(Pause)
       if pause:
            os.write(slave, 's')
       time.sleep(0.5)
    Du fait que 'mpg123' ne se ferme pas, p.returncode reste à "None" et je ne peux pas sortir de la boucle.

    Par contre, une fois la lecture terminée, 'mpg123' retourne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [0:22] Decoding of 07.mp3 finished.
    Je voudrais récupérer ce message dans une variable pour sortir de la boucle.
    C'est peut-être très simple mais je n'ai pas trouvé.
    merci de votre aide et de votre indulgence

    Jihem74

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Essaye comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ret, err = subprocess.Popen(["mpg123", "-C", path], 
                            universal_newlines=True, 
                            stdout=subprocess.PIPE).communicate()
    print(ret)
    print(err)
    et vois ce que donnent les deux print() ...

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 81
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2019
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Bonsoir
    merci de ta réponse
    en fait, l'action que tu préconise est bloquante et je n'ai plus accès aux interactions avec le lecteur mp3.
    n'existe t'il pas une instruction permettant d’enregistrer le retour sur le terminal?

  4. #4
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Alors rajoute stdin=master à la commande comme tu l'avais fait.

    Interagir avec un process externe à python demande toujours de procéder par essais successifs.

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 81
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2019
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    bonsoir
    non toujours le même résultat; la commande est bloquante et empêche l'entrée dans la boucle.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par jihem74 Voir le message
    C'est peut-être très simple mais je n'ai pas trouvé.
    Non, ce n'est pas simple!

    Maintenant:
    Citation Envoyé par jihem74 Voir le message
    Le problème est que 'mpg123' ne se ferme pas à la fin du morceau quand je le lance depuis mon script python (alors qu'il se ferme si je le lance depuis un script bash)
    Si vous voulez que le programme se termine, il ne faut pas le lancer en '"mode interactif" i.e. avec l'option -C et dans ce cas, inutile de créer un "pty" pour interagir avec.

    Dans le cas contraire (on veut interagir via le "pty"), la question serait de savoir comment lire et écrire à travers le "pty" pour que... et d’expédier "q" pour faire sortir le programme.
    Et si c'est le cas, c'est une soupe très unixish pour laquelle il va falloir rechercher sur Internet une recette applicable à votre cas...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 81
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2019
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Bonjour à tous

    @wiztricks
    Merci de votre réponse
    Dans le cas contraire (on veut interagir via le "pty"), la question serait de savoir comment lire et écrire à travers le "pty" pour que... et d’expédier "q" pour faire sortir le programme.
    Et si c'est le cas, c'est une soupe très unixish pour laquelle il va falloir rechercher sur Internet une recette applicable à votre cas...
    Je veux effectivement interagir avec le lecteur mp3 et cela fonctionne bien avec les commandes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    os.write(slave, 's') #pause
    os.write(slave, 'f') #suivant
    os.write(slave, 'q') #quitter
    etc...
    le problème est que, même avec la commande 'q', le programme 'mpg123' de se termine pas.

    la seule indication envoyée par 'mpg123' à la fin de la lecture est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Decoding of xxx.mp3 finished
    C'est ce retour que je voudrais exploiter pour faire un 'break' dans la boucle 'while' et lancer une commande pour mettre fin au programme.

    Pour m'exprimer autrement,
    une chaine envoyée par un programme fils s'affiche dans le terminal:
    comment exploiter ce retour pour en faire une variable utilisable par le programme maître?


    Merci d'avance

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par jihem74 Voir le message
    [B]comment exploiter ce retour pour en faire une variable utilisable par le programme maître?
    C'est le genre de sujet où personne ne sait.
    D'abord parce que c'est très spécifique à Linux, ensuite parce que le comportement dépend de la mouture de Linux utilisée, enfin parce que la solution est très spécifique à l'application que l'on veut "commander".
    Si j'étais à votre place, je cacherai cette horreur en utilisant pexpect (çà utilise des "pty" en dessous mais çà devrait être plus simple à mettre en œuvre avec peut être un soucis côté "buffering").

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 81
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2019
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    bonjour

    Cela parait effectivement plus compliqué que je ne l'avait imaginé.

    Je pense que je vais me tourner vers une autre approche du sujet.

    Merci de vos conseils

    jihem74

Discussions similaires

  1. Utilisation de REPLACE() dans un programme PL/SQL
    Par Djene dans le forum PL/SQL
    Réponses: 8
    Dernier message: 10/12/2009, 11h30
  2. utiliser fichier XML dans un programme C++
    Par ilimo dans le forum Bibliothèques
    Réponses: 1
    Dernier message: 13/04/2006, 11h42
  3. utilisation de zlib dans un programme c/c++
    Par romzaide dans le forum Bibliothèques
    Réponses: 6
    Dernier message: 27/05/2005, 14h57
  4. [Debutant(e)] Code de retour de mon programme
    Par benji999 dans le forum Général Java
    Réponses: 2
    Dernier message: 10/12/2004, 13h15
  5. [commande DOS] Récupérer le code retour d'un programme
    Par bobunny dans le forum Scripts/Batch
    Réponses: 8
    Dernier message: 04/06/2004, 15h51

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