Comment masquer la sortie de subprocess en python 2.7

j'utilise eSpeak sur Ubuntu et j'ai un script Python 2.7 qui imprime et parle un message:

import subprocess
text = 'Hello World.'
print text
subprocess.call(['espeak', text])

eSpeak produit les sons désirés, mais encombre le shell avec quelques erreurs (ALSA lib..., pas de connexion socket) donc je ne peux pas facilement lire ce qui a été imprimé plus tôt. Le code de sortie est 0.

malheureusement, il n'y a pas d'option documentée pour éteindre sa verbosité, donc je cherche un moyen de le faire taire visuellement et garder la coquille ouverte propre pour plus d'interaction.

Comment faire?

214
demandé sur ferkulat 2012-06-30 02:08:57

6 réponses

rediriger la sortie vers DEVNULL:

import os
import subprocess

FNULL = open(os.devnull, 'w')
retcode = subprocess.call(['echo', 'foo'], stdout=FNULL, stderr=subprocess.STDOUT)

c'est effectivement la même chose que d'exécuter cette commande shell:

retcode = os.system("echo 'foo' &> /dev/null")
329
répondu jdi 2012-06-30 01:12:06

Voici une version plus portable (juste pour le plaisir, il n'est pas nécessaire dans votre cas):

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from subprocess import Popen, PIPE, STDOUT

try:
    from subprocess import DEVNULL # py3k
except ImportError:
    import os
    DEVNULL = open(os.devnull, 'wb')

text = u"René Descartes"
p = Popen(['espeak', '-b', '1'], stdin=PIPE, stdout=DEVNULL, stderr=STDOUT)
p.communicate(text.encode('utf-8'))
assert p.returncode == 0 # use appropriate for your program error handling here
73
répondu jfs 2012-06-30 01:02:41

Utilisation subprocess.check_output (nouveau en python 2.7). Il supprimera stdout et soulèvera une exception si la commande échoue. (Il retourne en fait le contenu de stdout, de sorte que vous pouvez l'utiliser plus tard dans votre programme si vous voulez.) Exemple:

import subprocess
try:
    subprocess.check_output(['espeak', text])
except subprocess.CalledProcessError:
    # Do something

vous pouvez également supprimer stderr avec:

    subprocess.check_output(["espeak", text], stderr=subprocess.STDOUT)

pour plus tôt que 2.7, utiliser

import os
import subprocess
with open(os.devnull, 'w')  as FNULL:
    try:
        subprocess._check_call(['espeak', text], stdout=FNULL)
    except subprocess.CalledProcessError:
        # Do something

ici, vous pouvez supprimer stderr avec

        subprocess._check_call(['espeak', text], stdout=FNULL, stderr=FNULL)
22
répondu Zags 2016-12-06 21:13:19

si vous utilisez le module subprocess dans windows (non spécifique à cette question mais correspond au titre) avec python 2.7 x et que ce ne sont que les erreurs que vous voulez supprimer (spécifique à cette question), vous pouvez faire quelque chose comme ceci:

output = subprocess.check_output(["arp", "-a", "-N", "127.0.0.2"], stderr=subprocess.STDOUT)

vous devriez pouvoir tester en utilisant le code ci-dessus sur votre système mais si 127.0.0.2 existe dans votre table arp vous pouvez juste choisir une ip qui n'a pas de nic associé à il.

0
répondu MarkProDev 2017-05-23 15:48:43

à partir de Python3, vous n'avez plus besoin d'ouvrir devnull et pouvez appeler le sous-processus .DEVNULL .

votre code serait mis à jour comme tel:

import subprocess
text = 'Hello World.'
print text
subprocess.call(['espeak', text], stderr=subprocess.DEVNULL)
0
répondu Josh Correia 2018-07-23 21:56:35

Pourquoi ne pas utiliser les commandes.getaoutput () à la place?

import commands

text = "Mario Balotelli" 
output = 'espeak "%s"' % text
print text
a = commands.getoutput(output)
-5
répondu lolamontes69 2014-08-31 22:40:28