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 :

pb pour réaliser un shell pipe


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 17
    Par défaut pb pour réaliser un shell pipe
    Bonjour,

    Après des heures d'essais et de recherches sur le net, je me résous à vous soumettre mon problème.

    Je souhaite réaliser un pipe équivalent à ce script :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #!/bin/sh
    espeak -v mb/mb-fr4 -f 'monfichier.txt' | mbrola -e /usr/share/mbrola/fr4/fr4 - -.au | paplay -n 'from script' --stream-name='espeak'
    Mais avec stdin qui remplace 'monfichier.txt'.

    J'ai lu dans la *Python Library Reference* http://docs.python.org/lib/node535.html

    qu'il fallait utiliser le module subprocess.

    Seulement cela fait plusieurs jours que je cherche mais mon programme freeze systematiquement dès que j'utilise la méthode *say* de la classe suivante :

    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
     
    import os,subprocess
    from subprocess import Popen, PIPE
     
    class Mbrola():
        def __init__(self):
     
            self.p1 = Popen(["espeak -v mb/mb-fr4"],
                shell=True,
                stdin=PIPE,
                stdout=PIPE)
     
            self.p2 = Popen(["mbrola -e /usr/share/mbrola/fr4/fr4 - -.au"],
                shell=True,
                stdin=self.p1.stdout,
                stdout=PIPE)
     
            self.p3 = subprocess.Popen(["paplay -n 'from script' --stream-name='espeak'"],
                shell=True,
                stdin=self.p2.stdout)
     
        def say(self, str):
            self.p1.communicate(str)
    Si quelqu'un à une idée je suis preneur car je n'en ai plus

    Merci,

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Par défaut
    EDIT 19/08 21:33
    Après des recherches supplémentaires, j'ai trouvé ça :
    http://www.nabble.com/subprocess.Pop...d16026600.html

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 17
    Par défaut
    Merci pour le lien.

    Pour l'instant la seule chose qui fonctionne c'est :

    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
     
    import os
    from subprocess import Popen, PIPE
     
    class Mbrola():
        def say(self, str):
            self.p = Popen(['mbrola','-e','/usr/share/mbrola/fr4/fr4','-','-.au'],
                shell = False,
                close_fds = True,
                stdin = PIPE,
                stdout = PIPE)
     
            self.p2 = Popen(['paplay','-n','from script','--stream-name=espeak'],
                shell = False,
                close_fds = True,
                stdin = PIPE,
                stdout = None)
     
            output = self.p.communicate(str)[0]
            self.p2.communicate(output)
    Mais je ne me décourage pas

    En tout cas, merci pour ton aide

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Par défaut
    Chez moi, la méthode avec fcntl fonctionne
    Voici mon code (les commandes utilisées sont simplement à titre d'essai) :
    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
    from subprocess import Popen, PIPE
    import fcntl
     
    class Test():
        def __init__(self):
            self.p1 = Popen(["number", "-l"],
                shell=True,
                stdin=PIPE,
                stdout=PIPE)
     
            fd = self.p1.stdin.fileno()
            old = fcntl.fcntl(fd, fcntl.F_GETFD)
            fcntl.fcntl(fd, fcntl.F_SETFD, old | fcntl.FD_CLOEXEC)
     
            self.p2 = Popen(["rot13"],
                shell=True,
                stdin=self.p1.stdout,
                stdout=PIPE)
     
        def say(self, str):
            self.p1.stdin.write(str)
            print "Said '%s'" % str.replace('\n', '')
     
    T = Test()
    T.say("1234\n")
    T.p1.stdin.close()
    print T.p2.communicate()[0]

Discussions similaires

  1. [HOOK] Problème(s) pour réaliser le tutoriel sur les HOOKS
    Par Rodrigue dans le forum C++Builder
    Réponses: 13
    Dernier message: 27/07/2016, 18h22
  2. question pour réaliser une pagination
    Par vbcasimir dans le forum Langage
    Réponses: 1
    Dernier message: 13/10/2005, 08h17
  3. Aidez-mois pour réaliser cette requete..
    Par mobeida dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/08/2005, 15h35
  4. aides pour script en shell
    Par komatek dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 12/08/2003, 15h36
  5. [Kylix] probleme pour lancer le shell
    Par miky dans le forum EDI
    Réponses: 5
    Dernier message: 13/08/2002, 09h39

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