Ich verwende eSpeak unter 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 erzeugt die gewünschten Sounds, überfrachtet die Shell jedoch mit einigen Fehlern (ALSA lib ..., keine Socket-Verbindung), sodass ich nicht einfach lesen kann, was zuvor gedruckt wurde. Der Exit-Code ist 0.
Leider gibt es keine dokumentierte Option, um die Ausführlichkeit auszuschalten. Daher suche ich nach einer Möglichkeit, sie nur visuell zum Schweigen zu bringen und die offene Hülle für weitere Interaktionen sauber zu halten.
Wie kann ich das machen?
python
python-2.7
subprocess
espeak
Rypel
quelle
quelle
os.system
Syntax anzuzeigen . Obwohl es nur zur Veranschaulichung ist. Stick mit subprocesssubprocess.DEVNUL
Lösung ermöglicht.Antworten:
Leiten Sie die Ausgabe nach DEVNULL um:
Es ist praktisch dasselbe wie das Ausführen dieses Shell-Befehls:
quelle
os.devnull
wennsubprocess.DEVNULL
nicht verfügbar ist (<3.3), verwenden,check_call()
anstatt,call()
wenn Sie den zurückgegebenen Code nicht überprüfen, Dateien im Binärmodus öffnen fürstdin/stdout/stderr
, die Verwendung vonos.system()
sollte nicht empfohlen werden,&>
funktioniert nichtsh
unter Ubuntu an explizit>/dev/null 2>&1
könnte verwendet werden.os.devnull
aber versehentlich abgetippt. Außerdem halte ich mich an die Verwendung von OPs,call
da sie die mögliche Ausnahme nicht abfangencheck_call
würden. Und für dieos.system
Weiterleitung war es eher ein Beispiel dafür, was die effektive Verwendung des Teilprozessansatzes bewirkt. Nicht wirklich als zweiter Vorschlag.close_fds=True
in verwendensubprocess.call
, um denFNULL
Deskriptor zu schließen, nachdem derclose_fds=True
, Filedeskriptoren geschlossen sind nachfork()
aber vorexecvp()
, dh sie in der geschlossenen Kind Prozess gerade bevor die ausführbare Datei ausgeführt wird.close_fds=True
funktioniert unter Windows nicht, wenn einer der Streams umgeleitet wird .close_fds
schließt keine Dateien im übergeordneten Prozess.Hier ist eine tragbarere Version (nur zum Spaß ist dies in Ihrem Fall nicht erforderlich):
quelle
DEVNULL
die nicht ganz allgemein ist, wie die vonsubprocess
; da es geöffnet istwb
, kann es nicht für verwendet werdenstdin
.'r+b'
Modus verwenden, wenn Sie ihn stattdessen benötigen.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. (Der Inhalt von stdout wird tatsächlich zurückgegeben, sodass Sie ihn später in Ihrem Programm verwenden können, wenn Sie möchten.) Beispiel:Sie können stderr auch unterdrücken mit:
Verwenden Sie für früher als 2.7
Hier können Sie stderr mit unterdrücken
quelle
except subprocess.CalledProcessError as e
und dann verwenden Siee.code
odere.output
Ab Python3 Sie nicht mehr benötigen , um offene devnull und nennen subprocess.DEVNULL .
Ihr Code würde als solcher aktualisiert:
quelle
stderr
mit demstdout
obigen Code ausgetauscht werden (oder als weiteres Argument anhängen), um Ausgaben zu unterdrücken. "Outputs" steht im Titel der Frage und was hat mich hierher geführt ... vielleicht trivial, aber ich dachte, es wäre erwähnenswert.Warum nicht stattdessen command.getoutput () verwenden?
quelle
text
Anführungszeichen enthalten sind, oder verwendet eine andere Zeichenkodierung oder ist zu groß für eine Befehlszeile. c) Es ist nur Unix (unter Python 2).