44 votes

Supprimer la sortie dans les appels Python aux exécutables

J'ai un binaire nommée A qui génère de sortie lorsqu'il est appelé. Si je l'appelle à partir d'un shell Bash, la majorité de la production est supprimée par A > /dev/null. La totalité de la production est supprimée par A &> /dev/null

J'ai un script python nommé B qui a besoin de faire appel A. Je veux être en mesure de générer une sortie de B, tandis que la suppression de toutes les données de sortie à partir d' A.

À partir de l'intérieur d' B, j'ai essayé d' os.system('A'), os.system('A > /dev/null'), et os.system('A &> /dev/null'), os.execvp('...'), etc. mais aucun de ceux-supprimer toutes les données de sortie à partir de A.

Je pourrais tourner B &> /dev/null, mais qui supprime tous B's de sortie trop et je n'en veux pas.

Quelqu'un a des suggestions?

102voto

DNS Points 17577
 import os
import subprocess

command = ["executable", "argument_1", "argument_2"]

with open(os.devnull, "w") as fnull:
    result = subprocess.call(command, stdout = fnull, stderr = fnull)
 

Si la commande n'a pas d'argument, vous pouvez simplement la fournir sous la forme d'une simple chaîne.

Si votre commande s'appuie sur des fonctionnalités du shell, telles que des caractères génériques, des tubes ou des variables d'environnement, vous devez fournir l'intégralité de la commande sous forme de chaîne et spécifier également shell = True . Cela devrait toutefois être évité, car cela représente un risque pour la sécurité si le contenu de la chaîne n'est pas soigneusement validé.

57voto

Manuel Points 2569

Si vous avez Python 2.4, vous pouvez utiliser le module de sous-processus :

 >>> import subprocess
>>> s = subprocess.Popen(['cowsay', 'hello'], \
      stderr=subprocess.STDOUT, stdout=subprocess.PIPE).communicate()[0]
>>> print s
 _______ 
< hello >
 ------- 
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
 

21voto

Mechanical snail Points 8589

En Python 3.3 et supérieures, subprocess prend en charge une option pour rediriger vers /dev/null. Pour l'utiliser, lors de l'appel d' .Popen et les amis, spécifiez stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, comme mot-clé arguments.

Donc DNS de réponse, réécrit pour Python 3.3,+, devient

import subprocess
command = ["executable", "argument_1", "argument_2"]
result = subprocess.call(command,
                         stdout=subprocess.DEVNULL,
                         stderr=subprocess.DEVNULL)

À partir de la documentation:

sous-processus.DEVNULL¶

Valeur spéciale qui peut être utilisé comme stdin, stdout ou stderr l'argument de Popen et indique que le fichier spécial de l'os.devnull va être utilisé.

Nouveau dans la version 3.3.

Pour Python 3.0 à 3.2, vous devez ouvrir manuellement le périphérique null à l'aide de open(os.devnull), en tant que DNS écrit.

12voto

Po' Lazarus Points 350

Si votre moteur de recherche vous conduire à cette vieille question (comme moi), sachez que l'utilisation de la PIPE peut conduire à des blocages. En effet, étant donné que les canaux sont mises en mémoire tampon, vous pouvez écrire un certain nombre d'octets dans un tuyau, même si personne ne le lire. Cependant, la taille de la mémoire tampon est finie. Et, par conséquent, si votre programme a une puissance plus grande que la mémoire tampon, Une volonté d'être bloqué sur l'écriture, alors que le programme appelant B attend la terminaison de A. Mais non, dans ce cas particulier... voir les commentaires ci-dessous.

Encore, je vous recommande d'utiliser Devin jean-pierre et DNS solution.

8voto

Devin Jeanpierre Points 23162

Comme le mentionnent les documents os.system (), utilisez le module de sous - processus et, si vous le souhaitez, définissez stdout = open (os.devnull, 'w') (et peut-être la même chose pour stderr) lorsque vous ouvrez le sous-processus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X