J'utilise eSpeak sur Ubuntu et j'ai un script Python 2.7 qui imprime et prononce un message:
import subprocess
text = 'Hello World.'
print text
subprocess.call(['espeak', text])
eSpeak produit les sons souhaités, mais encombre le shell avec quelques erreurs (ALSA lib ..., pas de connexion de 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 désactiver sa verbosité, donc je cherche un moyen de le faire taire uniquement visuellement et de garder le shell ouvert propre pour une interaction ultérieure.
Comment puis-je faire ceci?
os.system
syntaxe. Bien que ce soit juste à titre d'illustration.subprocess.DEVNUL
solution parfaite .Réponses:
Redirigez la sortie vers DEVNULL:
C'est en fait la même chose que d'exécuter cette commande shell:
la source
os.devnull
sisubprocess.DEVNULL
n'est pas disponible (<3.3), utilisercheck_call()
au lieu decall()
si vous ne vérifiez pas son code renvoyé, ouvrir les fichiers en mode binaire pourstdin/stdout/stderr
, l'utilisation deos.system()
doit être déconseillée,&>
ne fonctionne passh
sur Ubuntu et explicite>/dev/null 2>&1
pourrait être utilisé.os.devnull
mais je l'ai accidentellement tapé. De plus, je m'en tiens à l'utilisation des POcall
car ils n'attrapent pas l'exception possiblecheck_call
. Et pour laos.system
redirection, il s'agissait plus simplement d'une illustration de ce que fait l'utilisation efficace de l'approche du sous-processus. Pas vraiment comme deuxième suggestion.close_fds=True
insubprocess.call
pour fermer leFNULL
descripteur après que le sous-processus existeclose_fds=True
, les descripteurs de fichiers sont fermés aprèsfork()
mais avant,execvp()
c'est-à-dire qu'ils sont fermés dans le processus enfant juste avant l'exécution de l'exécutable.close_fds=True
ne fonctionnera pas sur Windows si l'un des flux est redirigé .close_fds
ne ferme pas les fichiers dans le processus parent .Voici une version plus portable (juste pour le plaisir, ce n'est pas nécessaire dans votre cas):
la source
DEVNULL
qui n'est pas complètement général, comme celui fourni parsubprocess
; depuis qu'il est ouvert,wb
il ne peut pas être utiliséstdin
.'r+b'
mode si vous en avez besoin à la place.Utiliser
subprocess.check_output
(nouveau dans python 2.7). Il supprimera stdout et déclenchera une exception si la commande échoue. (Il retourne en fait le contenu de stdout, vous pouvez donc l'utiliser plus tard dans votre programme si vous le souhaitez.) Exemple:Vous pouvez également supprimer stderr avec:
Pour les versions antérieures à 2.7, utilisez
Ici, vous pouvez supprimer stderr avec
la source
except subprocess.CalledProcessError as e
puis utiliseze.code
oue.output
Depuis Python3, vous n'avez plus besoin d'ouvrir devnull et vous pouvez appeler subprocess.DEVNULL .
Votre code serait mis à jour en tant que tel:
la source
stderr
avec lestdout
code ci-dessus (ou ajouter comme autre argument) pour supprimer les sorties. "Sorties" est dans le titre de la question et ce qui m'a amené ici ... peut-être trivial, mais j'ai pensé qu'il valait la peine d'être mentionné.Pourquoi ne pas utiliser plutôt commands.getoutput ()?
la source
text
contient des guillemets, ou utilise un codage de caractères différent, ou trop grand pour une ligne de commande c) il est Unix uniquement (sur Python 2)