J'ai un grand projet composé d'un nombre suffisamment grand de modules, chacun imprimant quelque chose à la sortie standard. Maintenant que le projet a pris de l'ampleur, il n'y en a pas. des print
déclarations s'impriment beaucoup sur le std, ce qui a considérablement ralenti le programme.
Donc, je veux maintenant décider au moment de l' exécution s'il faut ou non imprimer quelque chose sur le stdout. Je ne peux pas faire de changements dans les modules car ils sont nombreux. (Je sais que je peux rediriger la sortie standard vers un fichier, mais même cela est considérablement lent.)
Ma question est donc de savoir comment rediriger la sortie stdout vers rien, c'est-à-dire comment faire en sorte que l' print
instruction ne fasse rien?
# I want to do something like this.
sys.stdout = None # this obviously will give an error as Nonetype object does not have any write method.
Actuellement, la seule idée que j'ai est de créer une classe qui a une méthode d'écriture (qui ne fait rien) et de rediriger le stdout vers une instance de cette classe.
class DontPrint(object):
def write(*args): pass
dp = DontPrint()
sys.stdout = dp
Existe-t-il un mécanisme intégré en python pour cela? Ou y a-t-il quelque chose de mieux que ça?
la source
Réponses:
Multiplateforme:
Sous Windows:
Sous Linux:
la source
sys.stdout
et réinstallez-la après. Par exemple,old_stdout = sys.stdout
avant tout autre code, puissys.stdout = old_stdout
lorsque vous avez terminé.os.write(1, b'abc\n')
. Vous devezos.dup2()
, pour rediriger au niveau du descripteur de fichier, voirstdout_redirected()
sys.__stdout__
pour annuler une redirection. Donc, vous faites justesys.stdout = sys.__stdout__
et pas besoin de stocker la sauvegarde.Une bonne façon de faire est de créer un petit processeur de contexte dans lequel vous enveloppez vos impressions. Il vous suffit ensuite d'utiliser est dans une
with
déclaration pour faire taire toute la sortie.Python 2:
Python 3.4+:
Python 3.4 a un processeur de contexte comme celui-ci intégré, vous pouvez donc simplement utiliser contextlib comme ceci:
L'exécution de ce code imprime uniquement la deuxième ligne de sortie, pas la première:
Cela fonctionne multi-plateforme (Windows + Linux + Mac OSX), et est plus propre que les autres réponses à mon humble avis.
la source
Si vous êtes en python 3.4 ou supérieur, il existe une solution simple et sûre utilisant la bibliothèque standard:
la source
with contextlib.redirect_stdout(None)
fonctionne aussiAttributeError: 'NoneType' object has no attribute 'write'
write
méthode factice qui ne fait rien. Voir ma réponse ci-dessous.(du moins sur mon système) il semble que l'écriture sur os.devnull soit environ 5 fois plus rapide que l'écriture dans une classe DontPrint, c'est-à-dire
a donné la sortie suivante:
la source
Si vous êtes dans un environnement Unix (Linux inclus), vous pouvez rediriger la sortie vers
/dev/null
:Et pour Windows:
la source
nul = myfunc()
?Que dis-tu de ça:
Cela utilise les fonctionnalités du module contextlib pour masquer la sortie de la commande que vous essayez d'exécuter, en fonction du résultat de
should_hide_output()
, puis rétablit le comportement de sortie une fois que cette fonction est exécutée.Si vous souhaitez masquer la sortie d'erreur standard, importez
redirect_stderr
depuiscontextlib
et ajoutez une ligne indiquantstack.enter_context(redirect_stderr(null_stream))
.Le principal inconvénient est que cela ne fonctionne que dans Python 3.4 et les versions ultérieures.
la source
redirect_stdout()
l'analogue sur les versions antérieures de Python (par exemple en utilisantcontextlib.contextmanager
) .Votre classe fonctionnera très bien (à l'exception du
write()
nom de la méthode - il doit être appeléwrite()
, en minuscules). Assurez-vous simplement d'enregistrer une copie desys.stdout
dans une autre variable.Si vous êtes sur un * NIX, vous pouvez le faire
sys.stdout = open('/dev/null')
, mais c'est moins portable que de lancer votre propre classe.la source
Vous pouvez simplement vous en moquer.
la source
Pourquoi tu n'essaies pas ça?
la source
C'est OK pour le
print()
cas. Mais cela peut provoquer une erreur si vous appelez une méthode de sys.stdout, par exemplesys.stdout.write()
.Il y a une note dans la documentation :
la source
sys.stdout = Null
donc dans certains cas, cela peut être dangereux.Supplément à la réponse d' iFreilicht - cela fonctionne à la fois pour python 2 et 3.
la source