Comment masquer la sortie du sous-processus dans Python 2.7
Je suis en utilisant eSpeak sur Ubuntu et avoir un Python 2.7 script 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 la coque, avec quelques erreurs (ALSA lib..., pas de prise connect) donc je ne peux pas lire facilement ce qui a été imprimé plus tôt. Code de sortie est de 0.
Malheureusement, il n'existe aucune preuve de l'option pour désactiver sa verbosité, donc je suis à la recherche d'un moyen pour que visuellement, le silence et de garder la coquille ouverte propre pour plus d'interaction.
Comment puis-je faire cela?
- vous ne pourriez pas vous suffit d'appeler avec des os.système alors? pas l'idéal, mais ne devriez pas l'impression que je ne pense pas que les
- os.system() imprime à la console, sauf si vous rediriger la commande shell
- non, os.système (espeak '+ texte) reproduit ce comportement.
- J'ai mis à jour ma réponse aussi de montrer la
os.system
de la syntaxe. Si c'est juste pour l'illustration. Stick avec des sous-processus - bonne correction ... c'est votre droit ... pour une raison que je me suis souvenu tort de penser que les os.le système n'a pas l'impression ...
- Non 2.7 version spécifique: stackoverflow.com/questions/5495078/... qui permet la parfaite
subprocess.DEVNUL
solution.
Vous devez vous connecter pour publier un commentaire.
Rediriger la sortie vers DEVNULL:
C'est effectivement la même que l'exécution de cette commande shell:
os.devnull
sisubprocess.DEVNULL
n'est pas disponible (<3.3), l'utilisationcheck_call()
au lieu decall()
si vous ne cochez pas son code de retour, ouvrir des fichiers en mode binaire pourstdin/stdout/stderr
, l'utilisation deos.system()
devrait être découragée,&>
ne fonctionne pas poursh
sur Ubuntu explicite>/dev/null 2>&1
pourrait être utilisé.os.devnull
mais accidentellement entré dans l'ordinateur. Aussi, je suis coller avec de la Fpo utilisation decall
car ils ne sont pas d'attraper l'exception possiblecheck_call
soulèverait. Et pour leos.system
de redirection, il était plus juste une illustration de ce que l'utilisation efficace de la sous-processus de l'approche est en train de faire. Pas vraiment comme une deuxième suggestion.close_fds=True
danssubprocess.call
pour fermer laFNULL
descripteur après le sous-processus existeclose_fds=True
, les descripteurs de fichiers sont fermés aprèsfork()
mais avantexecvp()
c'est à dire, ils sont fermés dans le enfants processus avant l'exécutable est exécuté.close_fds=True
ne fonctionne pas sur Windows si les flux sont redirigés.close_fds
ne pas fermer les fichiers dans le parent processus.stderr
est changé àFNULL
(oustdout=FNULL, stderr=subprocess.STDOUT
). (moght être quelque chose de spécifique pour 7zip)os.system("command")
?Ici est une version portable (juste pour le fun, il n'est pas nécessaire dans votre cas):
DEVNULL
ce qui n'est pas pleinement général, comme celui fourni parsubprocess
; parce qu'il est ouvertwb
il ne peut pas être utilisé pourstdin
.'r+b'
mode si vous avez besoin d'elle à la place.Utilisation
sous-processus.check_output
(nouveau en python 2.7). Il va supprimer stdout et lever une exception si la commande échoue. (En fait, il retourne le contenu de la sortie standard, donc vous pouvez l'utiliser plus tard dans votre programme si vous le souhaitez.) Exemple:Vous pouvez également supprimer les stderr avec:
Pour plus tôt que de 2,7, utilisez
Ici, vous pouvez supprimer stderr avec
except subprocess.CalledProcessError as e
et ensuite utilisere.code
oue.output
De Python3 vous n'avez plus besoin d'ouvrir devnull et peut appeler sous-processus.DEVNULL.
Votre code sera mis à jour en tant que tel:
si vous arrive d'être en utilisant le sous-processus module dans windows (pas spécifique à cette question, mais les matchs de titre) avec python 2.7 x et c'est SEULEMENT les erreurs que vous souhaitez 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 être en mesure de tester à l'aide du code ci-dessus sur votre système, mais si 127.0.0.2 qui se passe dans votre table arp il vous suffit de prendre une ip qui ne dispose pas d'une carte d'interface réseau associée.
output
a mushed de sortie et des erreurs, ce qui n'est probablement pas ce qui est souhaité.Pourquoi ne pas utiliser les commandes.getoutput() à la place?
text
a cite dans, ou utilise un autre codage de caractères, ou trop grand pour une ligne de commande c) c'est uniquement pour Unix (sur Python 2)