Pour empêcher une fonction d'imprimer dans la console de lot En Python

eh Bien, le titre me semble suffisant. J'utilise une fonction qui à certains moments l'impression de quelque chose dans la console. Comme je ne peux pas les modifier, j'aimerais savoir s'il existe une solution pour ne pas imprimer en utilisant ces fonctions.

Merci beaucoup !

Nico

18
demandé sur NicoCati 2011-12-09 18:47:54

5 réponses

Oui, vous pouvez rediriger sys.stdout:

import sys
import os

sys.stdout = open(os.devnull, "w")

my_nasty_function()

sys.stdout = sys.__stdout__

il suffit de remplacer my_nasty_function avec votre fonction réelle.

EDIT: maintenant devrait fonctionner sur windows aswell et fait usage de sys.__stdout__ au lieu d'une variable de sauvegarde.

26
répondu Constantinius 2011-12-09 15:15:23

la réponse de Constantinius la réponse est ok, cependant il n'est pas nécessaire d'ouvrir périphérique null. Et BTW, si vous voulez appareil null portable, il ya os.devnull.

en fait, tout ce dont vous avez besoin est une classe qui ignorera tout ce que vous lui écrirez. Donc la version plus portable serait:

class NullIO(StringIO):
    def write(self, txt):
       pass

sys.stdout = NullIO()

my_nasty_function()

sys.stdout = sys.__stdout__

.

8
répondu vartec 2017-05-23 12:25:48

la solution de Constantinius fonctionnera sur * nix, mais cela devrait fonctionner sur n'importe quelle plate-forme:

import sys
import tempfile

sys.stdout = tempfile.TemporaryFile()

# Do crazy stuff here

sys.stdout.close()
#now the temp file is gone
sys.stdout = sys.__stdout__
1
répondu dtanders 2011-12-09 15:13:28

Vous pouvez utiliser une version modifiée de ce réponse pour créer un contexte de sortie" null " pour envelopper l'appel dans la fonction.

Qui peut être fait simplement en passant os.devullnew_stdout argument stdout_redirected() fonction de gestionnaire de contexte lorsqu'elle est utilisée.

1
répondu martineau 2017-07-25 04:45:53

une autre ouverture serait d'envelopper votre fonction dans un décorateur.

import sys
from io import stringIO 

class NullIO(StringIO):
    def write(self, txt):
        pass


def silent(fn):
    """Decorator to silence functions."""
    def silent_fn(*args, **kwargs):
        saved_stdout = sys.stdout
        sys.stdout = NullIO()
        result = fn(*args, **kwargs)
        sys.stdout = saved_stdout
        return result
    return silent_fn


def nasty():
    """Uselful function with nasty prints."""
    print('a lot of annyoing output')
    return 42


# Wrap in decorator to prevent printing.
silent_nasty = silent(nasty)
# Same output, but prints only once.
nasty(), silent_nasty()
0
répondu Jarno 2018-01-09 19:10:31