373 Stimmen

Wie kann man die Ausgabe eines Unterprozesses ausblenden?

Ich verwende eSpeak auf Ubuntu und habe ein Python 2.7 Skript, das eine Nachricht druckt und spricht:

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

eSpeak produziert die gewünschten Töne, aber überhäuft die Shell mit einigen Fehlern (ALSA lib..., no socket connect), so dass ich nicht einfach lesen kann, was vorher gedruckt wurde. Der Exit-Code ist 0.

Leider gibt es keine dokumentierte Option, um seine Ausführlichkeit abzuschalten, also suche ich nach einer Möglichkeit, es nur visuell zum Schweigen zu bringen und die offene Shell für weitere Interaktionen sauber zu halten.

Wie kann ich das tun?

588voto

jdi Punkte 86608

Für Python >= 3.3, die Ausgabe nach DEVNULL umleiten:

import os
import subprocess

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

Für Python <3.3, einschließlich 2.7 verwenden:

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

Es ist praktisch dasselbe wie die Ausführung dieses Shell-Befehls:

retcode = os.system("echo 'foo' &> /dev/null")

106voto

jfs Punkte 370717

Hier ist eine portablere Version (nur zum Spaß, sie ist in Ihrem Fall nicht notwendig):

#!/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

35voto

Zags Punkte 30855

Verwenden Sie subprocess.check_output (neu in Python 2.7). Es unterdrückt stdout und löst eine Ausnahme aus, wenn der Befehl fehlschlägt. (Es gibt den Inhalt von stdout zurück, so dass Sie diesen später in Ihrem Programm verwenden können, wenn Sie wollen). Beispiel:

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

Sie können stderr auch mit unterdrücken:

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

Für frühere Versionen als 2.7, verwenden Sie

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

Hier können Sie stderr unterdrücken mit

        subprocess._check_call(['espeak', text], stdout=FNULL, stderr=FNULL)

33voto

Josh Correia Punkte 2680

Ab Python3 müssen Sie devnull nicht mehr öffnen und können subprocess.DEVNULL .

Ihr Code würde dann entsprechend aktualisiert werden:

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

-7voto

lolamontes69 Punkte 39

Warum nicht stattdessen commands.getoutput() verwenden?

import commands

text = "Mario Balotelli" 
output = 'espeak "%s"' % text
print text
a = commands.getoutput(output)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X