Python >> Tutoriel Python >  >> Python

Comment masquer la sortie du sous-processus en Python 2.7

Redirigez 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")

Mettre à jour :Cette réponse s'applique à la question initiale relative à python 2.7. Depuis python>=3.3 un subprocess.DEVNULL officiel symbole a été ajouté.

retcode = subprocess.call(['echo', 'foo'], 
    stdout=subprocess.DEVNULL, 
    stderr=subprocess.STDOUT)

Voici une version plus portable (juste pour le plaisir, ce 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

Utilisez subprocess.check_output (nouveau en python 2.7). Il supprimera stdout et déclenchera une exception si la commande échoue. (Il renvoie en fait le contenu de stdout, vous pouvez donc l'utiliser plus tard dans votre programme si vous le souhaitez.) 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 les versions antérieures à 2.7, utilisez

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)