Attribution de la variable stdout
que vous faites n'a aucun effet, dans l'hypothèse foo
contient des déclarations print
- encore un autre exemple des raisons pour lesquelles vous ne devriez jamais importer des choses de l'intérieur un module (comme vous faites ici), mais toujours un module dans son ensemble (utilisez alors des noms qualifiés). Le copy
est hors de propos, d'ailleurs. L'équivalent correct de votre extrait est:
import sys
save_stdout = sys.stdout
sys.stdout = open('trash', 'w')
foo()
sys.stdout = save_stdout
Maintenant, lorsque le code est correct, est le temps de le rendre plus élégant ou rapide. Par exemple, vous pouvez utiliser un lieu de fichier « » trash en mémoire objet de type fichier:
import sys
import io
save_stdout = sys.stdout
sys.stdout = io.BytesIO()
foo()
sys.stdout = save_stdout
pour l'élégance, un contexte est le meilleur, par exemple:
import contextlib
import io
import sys
@contextlib.contextmanager
def nostdout():
save_stdout = sys.stdout
sys.stdout = io.BytesIO()
yield
sys.stdout = save_stdout
une fois que vous avez défini ce contexte, pour un bloc dans lequel vous ne voulez pas stdout,
with nostdout():
foo()
optimisation plus: il vous suffit de remplacer sys.stdout avec un objet qui a une no-op write
méthode. Par exemple:
import contextlib
import sys
class DummyFile(object):
def write(self, x): pass
@contextlib.contextmanager
def nostdout():
save_stdout = sys.stdout
sys.stdout = DummyFile()
yield
sys.stdout = save_stdout
à utiliser la même manière que la mise en œuvre précédente de nostdout
. Je ne pense pas que ça devienne plus propre ou plus rapide que ça ;-).
Je dirais que vous devriez laisser sans correction, puisque Alex déjà fait pour vous. Cela aurait plus de sens pour qui lit. – cregox
Cawas: Je vais ajouter mon une première non corrigée au-dessus de lui. Ou quelque chose de similaire avec les mêmes erreurs. Bon appel –
lié: [Rediriger temporairement stdout/stderr] (http://stackoverflow.com/q/6796492/4279) – jfs